Java 使用Jackson将CSV转换为JSON-如何删除嵌入CSV列标题中的换行符
在快速搜索之后,我找到了一种使用Jackson库读取CSV文件并将其解析为JSON的简单方法。一切都很好,除了。。。一些CSV标题列名嵌入了换行符。程序可以处理它,但剩下的JSON键中嵌入了换行符。我想删除这些(或用空格替换它们) 下面是我找到的一个简单程序: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;
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?