java csv分号问题
我必须修改一个程序。此程序在数据库中创建csv文件,列如下:java csv分号问题,java,regex,csv,separator,Java,Regex,Csv,Separator,我必须修改一个程序。此程序在数据库中创建csv文件,列如下: csvBuilder.initCsvFile(); csvBuilder.createRow(headers.toArray(new String[headers.size()])); while (resultSet.next()) { String[] row = new String[resultSetColumnCount]; int columnIndex = 1;
csvBuilder.initCsvFile();
csvBuilder.createRow(headers.toArray(new String[headers.size()]));
while (resultSet.next()) {
String[] row = new String[resultSetColumnCount];
int columnIndex = 1;
while (columnIndex <= resultSetColumnCount) {
Object object = resultSet.getObject(columnIndex);
if (object == null) {
row[columnIndex - 1] = "";
} else {
row[columnIndex - 1] = object.toString();
}
columnIndex++;
}
csvBuilder.createRow(row);
}
createRow方法:
public void createRow(String[] row) {
writer.writeNext(row);
}
问题是,我有一些数据包含分隔符“;”如下图所示
id col1 col2
1 US United;States
不幸的是,csv文件将美国一分为二。如何检查resultSet的内容并跳出分隔符,而不修改所有程序以获得统一;一排的州
感谢您的帮助在这种情况下,您需要一些引号字符,否则会出现歧义;在您的案例中,您指示它不要使用引号,因此,它无法处理这些案例 尝试显式定义引号字符:
public void initCsvFile() {
try {
writer = new CSVWriter(new FileWriter(filePath), ';', '"');
} catch (IOException e) {
logger.error("CsvBuilder : error when creating {}", filePath, e);
throw new CsvException("Error when creating the file : " + filePath, e);
}
}
请记住,在这种情况下,任何可能导致歧义的数据都将包含在引号中:
1;US;"United;States"
这是有效的CSV,大多数CSV解析器在读取时会自动删除引号。在这些情况下,您需要一些引号字符,否则会产生歧义;在您的案例中,您指示它不要使用引号,因此,它无法处理这些案例 尝试显式定义引号字符:
public void initCsvFile() {
try {
writer = new CSVWriter(new FileWriter(filePath), ';', '"');
} catch (IOException e) {
logger.error("CsvBuilder : error when creating {}", filePath, e);
throw new CsvException("Error when creating the file : " + filePath, e);
}
}
请记住,在这种情况下,任何可能导致歧义的数据都将包含在引号中:
1;US;"United;States"
这是有效的CSV,大多数CSV解析器在读取时会自动删除引号。您可以在创建这样的CSV行之前替换“;”
while (resultSet.next()) {
String[] row = new String[resultSetColumnCount];
int columnIndex = 1;
while (columnIndex <= resultSetColumnCount) {
Object object = resultSet.getObject(columnIndex);
if (object == null) {
row[columnIndex - 1] = "";
} else {
// replace ";" by ""
row[columnIndex - 1] = object.toString().replace(";", "");
}
columnIndex++;
}
csvBuilder.createRow(row);
}
while(resultSet.next()){
String[]行=新字符串[resultSetColumnCount];
int columnIndex=1;
而(columnIndex您可以在这样创建csv行之前替换“;”
while (resultSet.next()) {
String[] row = new String[resultSetColumnCount];
int columnIndex = 1;
while (columnIndex <= resultSetColumnCount) {
Object object = resultSet.getObject(columnIndex);
if (object == null) {
row[columnIndex - 1] = "";
} else {
// replace ";" by ""
row[columnIndex - 1] = object.toString().replace(";", "");
}
columnIndex++;
}
csvBuilder.createRow(row);
}
while(resultSet.next()){
String[]行=新字符串[resultSetColumnCount];
int columnIndex=1;
而(columnIndex我刚刚遇到了一个类似的问题。显然,字符串应该用双引号转义,以防止此类问题。因此我创建了一个escapeCSVDatum()
函数:
private static String escapeCSVDatum(String s){
return "\""+s.replace("\"", "\"\"").replace("\n", " ")+"\"";
}
因此,在你的情况下,它将适用于这里
} else {
row[columnIndex - 1] = escapeCSVDatum(object.toString());
}
但是,正如Haroldo__OK所述,您使用的CSVWriter.NO_QUOTE_CHARACTER
无法正确处理此类情况。在具有此属性的数据中不可能有分号
因此,您可能希望修改代码以用空格替换分号,如下所示
} else {
row[columnIndex - 1] = object.toString().replace(";"," ");
}
最后,如果你想惹人生气,用希腊问号替换分号。我刚刚遇到了一个类似的问题。显然,字符串应该用双引号转义,以防止此类问题。因此我创建了一个escapeCSVDatum()
函数:
private static String escapeCSVDatum(String s){
return "\""+s.replace("\"", "\"\"").replace("\n", " ")+"\"";
}
因此,在你的情况下,它将适用于这里
} else {
row[columnIndex - 1] = escapeCSVDatum(object.toString());
}
但是,正如Haroldo__OK所述,您使用的CSVWriter.NO_QUOTE_CHARACTER
无法正确处理此类情况。在具有此属性的数据中不可能有分号
因此,您可能希望修改代码以用空格替换分号,如下所示
} else {
row[columnIndex - 1] = object.toString().replace(";"," ");
}
最后,如果你想惹人生气,用希腊问号替换分号。如果从原始数据中丢失不成问题,我会用replace()替换“;”,如果从原始数据中丢失它不是一个问题。只要丢失这些分号不是问题,这可能是一个好的解决方案。不幸的是,我不能释放分号,但谢谢你认为只要丢失这些分号不是问题,这可能是一个好的解决方案。不幸的是,我不能释放分号,但谢谢你认为这是正确的但是,我在csv文件中找到了围绕每个项目的“,”我想我没有选择。谢谢:)这是正确的,但是,我在csv文件中找到了围绕每个项目的“,”我想我没有选择。谢谢:)目前,我不能替换分号,但谢谢:)目前,我不能替换分号,但谢谢:)