【问题标题】:Using Jackson to convert CSV to JSON - How to remove newlines embedded in CSV column header使用 Jackson 将 CSV 转换为 JSON - 如何删除嵌入在 CSV 列标题中的换行符
【发布时间】:2020-09-10 17:38:25
【问题描述】:

经过一些快速的谷歌搜索后,我找到了一种使用 Jackson 库读取 CSV 文件并将其解析为 JSON 的简单方法。一切都很好,除了......一些 CSV 标题列名称嵌入了换行符。该程序处理它,但我留下了嵌入换行符的 JSON 键。我想删除这些(或用空格替换它们)。

这是我找到的简单程序:

import java.io.File;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;

public class CSVToJSON {

  public static void main(String[] args) throws Exception {
    File input = new File("PDM_BOM.csv");
    File output = new File("output.json");

    CsvSchema csvSchema = CsvSchema.builder().setUseHeader(true).build();
    CsvMapper csvMapper = new CsvMapper();

    // Read data from CSV file
    List<Object> readAll = csvMapper.readerFor(Map.class).with(csvSchema).readValues(input)
        .readAll();

    ObjectMapper mapper = new ObjectMapper();

    // Write JSON formated data to output.json file
    mapper.writerWithDefaultPrettyPrinter().writeValue(output, readAll);

    // Write JSON formated data to stdout
    System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(readAll));
  }
}

所以,举个例子:

PARENT\nITEM\nNUMBER

以下是生成的示例:

"PARENT\nITEM\nNUMBER" : "208E8840040",

我需要这样:

"PARENT ITEM NUMBER" : "208E8840040",

Jackson 映射器上是否有可以处理此问题的配置设置?或者,我是否需要为映射器提供某种自定义“处理程序”?

特殊情况

为了增加一些复杂性,在某些情况下,仅用空格替换换行符不会总是产生所需的内容。

示例 1:

有时会有这样的列标题:

QTY\nORDER/\nTRANSACTION

在这种情况下,我需要删除换行符并替换为空,这样结果是:

QTY ORDER/TRANSACTION , 不是 QTY ORDER/ TRANSACTION

示例 2:

有时,出于某种原因,列标题在换行符之前有一个空格:

EFFECTIVE \nTHRU DATE

这需要输出为:

EFFECTIVE THRU DATE , 不是 EFFECTIVE THRU DATE

任何关于如何处理至少主要问题的想法将不胜感激。

【问题讨论】:

    标签: java json csv jackson


    【解决方案1】:

    您可以使用 String replaceAll() 方法将所有新行替换为空格。

    String str = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(readAll);
    str = str.trim().replaceAll("[\n\s]+", " ");
    

    【讨论】:

    • 试过了,但没用。换行符仍然存在。
    • 您是否需要使用 Java 行分隔符系统属性而不是使用 \n? geeksforgeeks.org/…
    【解决方案2】:

    好的,想出了一个解决方案。这很丑陋,但它有效。基本上,在CsvMapper 完成后,我会检查生成的巨大丑陋集合并执行String.replaceAll(感谢https://stackoverflow.com/users/4402505/prem-kurian-philip 的建议)以删除不需要的字符,然后重建地图。

    无论如何,这是新代码:

    public class CSVToJSON {
    
      public static void main(String[] args) throws Exception {
        File input = new File("PDM_BOM.csv");
        File output = new File("output.json");
    
        CsvSchema csvSchema = CsvSchema.builder().setUseHeader(true).build();
        CsvMapper csvMapper = new CsvMapper();
    
        // Read data from CSV file
        List<Object> readData = csvMapper.readerFor(Map.class).with(csvSchema).readValues(input)
            .readAll();
    
        for (Object mapObj : readData) {
          LinkedHashMap<String, String> map = (LinkedHashMap<String, String>) mapObj;
          List<String> deleteList = new ArrayList<>();
          LinkedHashMap<String, String> insertMap = new LinkedHashMap<>();
    
          for (Object entObj : map.entrySet()) {
            Entry<String, String> entry = (Entry<String, String>) entObj;
            String oldKey = entry.getKey();
            String newKey = oldKey.replaceAll("[\n\s]+", " ");
            String value = entry.getValue();
    
            deleteList.add(oldKey);
            insertMap.put(newKey, value);
          }
    
          // Delete the old ...
          for (String oldKey : deleteList) {
            map.remove(oldKey);
          }
    
          // and bring in the new
          map.putAll(insertMap);
        }
    
        ObjectMapper mapper = new ObjectMapper();
    
        // Write JSON formated data to output.json file
        mapper.writerWithDefaultPrettyPrinter().writeValue(output, readData);
    
        // Write JSON formated data to stdout
        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(readAll));
      }
    }
    

    似乎应该有更好的方法来实现这一点。

    【讨论】:

      猜你喜欢
      • 2020-12-29
      • 2019-09-24
      • 1970-01-01
      • 2015-08-23
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多