如何在Java中读取多个行值CSV文件?

时间:2019-12-23 15:39:02

标签: java json csv opencsv

由于有效的JSON文件可能仅包含一个JSON,因此我打算将多个JSON放入CSV文件中,并以“;”分隔。并使用OpenCSV进行阅读。 (这是为了将文件中的JSON数据与JUnit类分开放置,以使其更具可读性。)

有没有一种方法可以读取行,直到定界符“;”为止发生了吗?也许通过附加字段 _name 增强JSON是一个好主意,该字段可用作Map读取JSON的键! 我首先以这种方式尝试过将其读入列表,但它只删除了“;”即可将所有行读入列表。我需要一种阅读方法,直到“;”为止发生时,将之前读取的所有行存储到Map 或更好的Map 中,然后继续下一行。

    final ClassLoader classLoader = CrmServiceUT.class.getClassLoader();
    final File file = new File(classLoader.getResource("data/UpdatedDeal1.csv").getFile());
    final List<List<String>> records = new ArrayList<List<String>>();
    final CSVParser parser = new CSVParserBuilder().withSeparator(';').build();
    try (final BufferedReader br = Files.newBufferedReader(file.toPath(), StandardCharsets.UTF_8);
         final CSVReader csvReader = new CSVReaderBuilder(br).withCSVParser(parser).build()){
        String[] values = null;
                List<String> list = null;
        while ((values = csvReader.readNext()) != null) {
            if( !Stream.of(values).anyMatch(x -> x.contains(";")) ) {
                list = Arrays.asList(values);
            }
            if(list.contains(";")) {
                list.remove(";");
            }
                records.add(list);
        }
    } catch (CsvValidationException e) {
        e.printStackTrace();
    } catch (CsvException e) {
        e.printStackTrace();
    }

JSON可能与几行或很多行完全不同:

{
  "_nodeName": "updatedDeal1",
  "results": [
    184896670
  ],
  "hasMore": false,
  "offset": 184896670
}
;
{
"_nodeName": "updatedDeal1",
"results": [
184896670
],
"hasMore": false,
"abcde": "xyz",
"offset": 184896670
}

有了LHCHIN的答案,我最终想到了这个解决方案,以进一步处理定界符(';')后接一行的下一个JSON的情况:

@BeforeAll
public static void beforeAll() throws IOException {
    final ClassLoader classLoader = CrmServiceUT.class.getClassLoader();
    final File file = new File(classLoader.getResource("data/jsonsUT.csv").getFile());
    final StringBuilder sb = new StringBuilder();
    for (final String line : Files.readAllLines(file.toPath(), StandardCharsets.UTF_8)) {
        sb.append(line);
        if (line.endsWith(";")) {
            putJsonToMap(sb.substring(0, sb.length()-1));
            sb.delete(0, sb.length());
        }
    }
    putJsonToMap(sb.substring(0, sb.length()));
}

/**
 * Fills a map with JSON used throughout the unit tests.
 *
 * @param jsonStr       The JSON to be stored.
 * @throws IOException
 */
private static void putJsonToMap(final String jsonStr) throws IOException {
    final JsonNode node = mapper.readTree(jsonStr);
    jsons.put(node.get("_nodeName").asText(), node);
    ((ObjectNode) node).remove("_nodeName");
}

3 个答案:

答案 0 :(得分:1)

对于您来说,使用opencsv并没有任何好处,所以为什么不自己处理呢!

下面的示例演示如何逐行读取给定的CSV文件并将每行放入StringBuilder进行连接,然后找到以;结尾的行,然后添加{ {1}}到StringBuilder的列表中。

代码段

String

之后,List<String> records = new ArrayList<>(); StringBuilder sb = new StringBuilder(); for (String line : Files.readAllLines(file.toPath(), StandardCharsets.UTF_8)) { sb.append(line); if (line.endsWith(";")) { records.add(sb.substring(0, sb.length()-1)); sb.delete(0, sb.length()); } } 中的每个元素都是一个JSON字符串,您可以直接访问它们以进行进一步的操作。

答案 1 :(得分:0)

您可以像这样读取CSV文件,并获取每一行和每一列

BufferedReader csvReader;
csvReader = new BufferedReader(new FileReader(file.getPath())); // csv file path
while ((row = csvReader.readLine()) != null) {
String[] data = row.split(",");  // in data you have each column value for each row
}

答案 2 :(得分:-1)

我想,随便吧。

json.replace('\n', '').replace(';','\n');