比较用于 csv 数据插入的字符串数组标头

Comparing String array headers for csv data insertion

提问人:Aindriu 提问时间:6/24/2023 最后编辑:Aindriu 更新时间:6/24/2023 访问量:54

问:

嗨,我正在尝试编写一个包含一些数据的 csv 文件,我想将 EMPTY_Columns 数组中的元素与MY_HEADERS数组进行比较,如果它们相同,我想写在空字符串中,如果它们不同,我想写一些数据。

我制作了一个布尔函数来检查标题是否相同,以便我可以将空字符串写入这些列并移动到下一行

private boolean sameHeaders(String[] A, String[] b) {
 for(int i = 0; i <= a.length - 1; i++) {
   if(a[i].equals(b[i]))
     return true;
  }
  return false
 }

我将此函数称为另一个函数,用于将 csv 数据写入 csv

private void writeCsvData(File csv, List<MyReport> reports) {
  try (Buffered write = new BufferedWriter(new FilterWrite(csv))) {
    write.write(getReportHeader());
    writer.newLine();
   for(MyReport report : reports) {
      if(!sameHeaders(MY_HEADERS, EMPTY_COLUMNS)) {
        writer.write(getReportData(report));
        writer.newLine();
       } else {
         writer.write("")
         writer.newLine();
       }
      }
    writer.flush();
   } catch (exception e) {
   //errors and exception logging
}


我以为这样的东西会起作用,但现在它只是将空字符串写入 csv 有人知道我哪里出错了吗?

Java 数组字符串 比较 文件编写器

评论

1赞 user16320675 6/24/2023
这不是正确的代码,它不应该编译(尽管也不完整) - 逻辑似乎很奇怪:如果任何两列匹配,则返回 true 并编写一些东西;否则,如果没有匹配,则将单元格留空
0赞 Reilas 6/24/2023
您能否提供 MyReport 的代码或伪代码?
0赞 Aindriu 6/24/2023
@user16320675所以MY_headers是我想写入数据的标题列表,empty_columns是我想将 emtpy 字符串写入的my_headers列表中的标题列表,目前在我尝试在这里实现我自己的检查之前,它只是将数据写入前 10 列无论如何。这是我尝试执行检查每个列表中的值是否相同,写空字符串,否则写数据。

答:

0赞 tim-danger 6/24/2023 #1

我写了一个基本的 JUnit-Test,它可以帮助澄清你要做什么。首先,我将您的代码放在一个名为以下内容的类中:HeaderComparator.java

public class HeaderComparator {

    public boolean sameHeaders(String[] a, String[] b) {
        for(int i = 0; i <= a.length - 1; i++) {
            if(a[i].equals(b[i]))
                return true;
        }
        return false;
    }
} 

这基本上与您提供的方法相同。之后,我编写了一个 JUnit-Test 来比较 2 个标头,分别称为 和 ,以测试您的期望:MY_HEADERSEMPTY_COLUMNS

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

/**
 * Unit test for simple App.
 */
public class HeaderComparatorTest {

    @Test
    public void testSameHeaders() {
        String[] MY_HEADERS = new String[] { "Header1", "Header2", "Header3"};
        String[] EMPTY_COLUMNS = new String[] { "Header1", "Header2", "Header3"};

        assertTrue(new HeaderComparator().sameHeaders(MY_HEADERS, EMPTY_COLUMNS));

    }

    @Test
    public void testDifferentHeaders1() {
        String[] MY_HEADERS = new String[] { "Header1", "Header2", "Header3"};
        String[] EMPTY_COLUMNS = new String[] { "", "Header2", "Header3"};

        assertFalse(new HeaderComparator().sameHeaders(MY_HEADERS, EMPTY_COLUMNS));

    }

    @Test
    public void testDifferentHeaders2() {
        String[] MY_HEADERS = new String[] { "Header1", "Header2", "Header3"};
        String[] EMPTY_COLUMNS = new String[] { "Header5", "Header2", "Header3"};

        assertFalse(new HeaderComparator().sameHeaders(MY_HEADERS, EMPTY_COLUMNS));

    }
}

第一个测试通过,根据您的期望是正确的(标头相同)。但是,第二个和第三个测试都失败了,这当然是不正确的,因为标头不同,并且您希望函数返回,而标头不相同。所以我想,你的函数的问题在于,只要同一索引下的两个元素(例如 在我提供的第二个和第三个测试中)是相同的。这可能不是你想要的。你希望它们都是一样的,对吧?falsetruea[1] = "Header2"b[1] = "Header2"

所以也许你想要这样的东西:

public class HeaderComparator {

    public boolean sameHeaders(String[] a, String[] b) {
        boolean result = true;
        for(int i = 0; i <= a.length - 1; i++) {
            result &= a[i].equals(b[i]);
        }
        return result;
    }
}

That makes all Unit-Tests pass. However, your function would require the two arrays to contain the columns in the exact same order.