Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Jackson将CSV转换为JSON-如何删除嵌入CSV列标题中的换行符_Java_Json_Csv_Jackson - Fatal编程技术网

Java 使用Jackson将CSV转换为JSON-如何删除嵌入CSV列标题中的换行符

Java 使用Jackson将CSV转换为JSON-如何删除嵌入CSV列标题中的换行符,java,json,csv,jackson,Java,Json,Csv,Jackson,在快速搜索之后,我找到了一种使用Jackson库读取CSV文件并将其解析为JSON的简单方法。一切都很好,除了。。。一些CSV标题列名嵌入了换行符。程序可以处理它,但剩下的JSON键中嵌入了换行符。我想删除这些(或用空格替换它们) 下面是我找到的一个简单程序: import java.io.File; import java.util.List; import java.util.Map; import com.fasterxml.jackson.databind.ObjectMapper;

在快速搜索之后,我找到了一种使用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));
  }
}
导入java.io.File;
导入java.util.List;
导入java.util.Map;
导入com.fasterxml.jackson.databind.ObjectMapper;
导入com.fasterxml.jackson.dataformat.csv.CsvMapper;
导入com.fasterxml.jackson.dataformat.csv.CsvSchema;
公共类CSVToJSON{
公共静态void main(字符串[]args)引发异常{
文件输入=新文件(“PDM_BOM.csv”);
文件输出=新文件(“output.json”);
CsvSchema CsvSchema=CsvSchema.builder().setUseHeader(true.build();
CsvMapper CsvMapper=新的CsvMapper();
//从CSV文件读取数据
List readAll=csvMapper.readerFor(Map.class).with(csvSchema).readValues(输入)
.readAll();
ObjectMapper mapper=新的ObjectMapper();
//将JSON格式的数据写入output.JSON文件
writerWithDefaultPrettyPrinter().writeValue(输出,readAll);
//将JSON格式的数据写入标准输出
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(readAll));
}
}
例如:

PARENT\nITEM\n编号

下面是一个生产的示例:

“父项\n项\n编号”:“208E8840040”,

我需要的是:

“父项编号”:“208E8840040”,

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

特殊情况

为了增加一些复杂性,在某些情况下,仅仅用空格替换换行符将而不是总是产生所需的结果

示例1:

有时会出现如下列标题:

QTY\nORDER/\n交易

在这种情况下,我需要删除换行符,并将其替换为零,以便得到以下结果:

数量订单/交易
数量订单/交易

示例2:

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

生效日期\nRU日期

这需要得出如下结论:

生效日期
生效日期


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

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

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

好的,我想出了一个解决办法。虽然很难看,但它很管用。基本上,在
CsvMapper
完成后,我将浏览生成的巨大丑陋集合,并执行
字符串。replaceAll
(感谢您的建议)以删除不需要的字符,然后重建地图

无论如何,新代码如下:

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));
  }
}
公共类CSVToJSON{
公共静态void main(字符串[]args)引发异常{
文件输入=新文件(“PDM_BOM.csv”);
文件输出=新文件(“output.json”);
CsvSchema CsvSchema=CsvSchema.builder().setUseHeader(true.build();
CsvMapper CsvMapper=新的CsvMapper();
//从CSV文件读取数据
List readData=csvMapper.readerFor(Map.class).with(csvSchema).readValues(输入)
.readAll();
用于(对象映射对象:readData){
LinkedHashMap=(LinkedHashMap)mapObj;
List deleteList=new ArrayList();
LinkedHashMap insertMap=新建LinkedHashMap();
对于(对象entObj:map.entrySet()){
条目条目=(条目)entObj;
字符串oldKey=entry.getKey();
字符串newKey=oldKey.replaceAll(“[\n\s]+”,”);
字符串值=entry.getValue();
deleteList.add(oldKey);
insertMap.put(newKey,value);
}
//删除旧的。。。
对于(字符串oldKey:deleteList){
map.remove(oldKey);
}
//带来新的
map.putAll(insertMap);
}
ObjectMapper mapper=新的ObjectMapper();
//将JSON格式的数据写入output.JSON文件
writerWithDefaultPrettyPrinter().writeValue(输出,读取数据);
//将JSON格式的数据写入标准输出
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(readAll));
}
}

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

尝试过,但没有成功。换行符仍然存在。是否需要使用Java行分隔符系统属性而不是使用\n?