2016-03-07 56 views
1

我正在写一个工具,它接受一个csv文件的输入并创建一个新的csv文件作为输出,其中一些字段被修改。在某些情况下,输入csv文件在逗号前后嵌入了引号,例如:“a”,“b”,“c”,而在其他情况下,我直接使用a,b,c。我遇到的问题是,如果输入csv文件已嵌入引号,那么我希望生成的csv文件应该具有相同的嵌入引号。我知道我可以按如下控制在CSVWriter的构造函数此设置:如何检测输入csv文件是否嵌入了引号?

CSVWriter writer = 
    new CSVWriter(new FileWriter(csv), ',', CSVWriter.NO_QUOTE_CHARACTER) 

但是,如何检测,我们有这种情况?我应该写一个正则表达式来计算引号字符的数量并将其与该计数进行比较,看它是否超过两倍?例如“a”,“b”,“c”有6个引号和2个逗号。

+1

通常情况下,只有那些带有逗号的字符串被引用。例如。 *你好,世界*可能会出现为'“你好,世界”',但*你好世界*不会。我怀疑你应该在每场的基础上控制报价。 – OldCurmudgeon

+0

实际上在我拥有的文件中,它要么是整行都嵌入了引号,要么根本没有嵌入引号 – Wael

+0

每行或每个文件是否存在问题?另外,你是否可以连续使用不包含嵌入的引号? – Asoub

回答

1

你可以尝试uniVocity-parsers检测格式:

CsvParserSettings parserSettings = new CsvParserSettings(); //many options here, check the tutorial. 
parserSettings.detectFormatAutomatically(); 

CsvParser parser = new CsvParser(parserSettings); 

//parse and get the detected format 
List<String[]> parsedRows = parser.parseAll(new File("/path/to/input.csv")); 
CsvFormat detectedFormat = parser.getDetectedFormat(); 

//now, write using the detected format: 
CsvWriterSettings writerSettings = new CsvWriterSettings(); 
writerSettings.setFormat(detectedFormat); 

CsvWriter writer = new CsvWriter(new File("/path/to/output.csv"), writerSettings); 
writer.writeStringRowsAndClose(parsedRows); 

披露:我是这个库的作者。它是开源的和免费的(Apache 2.0许可证)

1

您必须阅读完整的行以检查它是否是嵌入式引号文件。如果您信任您的输入,那么您只需检查第一行(如果第一行是列定义,则第二行)。

对于这一行,检查它是否以双引号开始并以双引号结尾(检查该行的第一个和最后一个字符为String)。

如果您仍然相信您的输入足够了,或者计算“,”的数目(不仅逗号,quote-comma-quote结构,没有空格,我猜),并将其与行数你的csv文件应该有(减一),如果它是一个固定值。

如果它不是每行固定值,那么你的解决方案应该可行,因为无论如何,通常情况下,没有CSV应该以逗号作为内容(如OldCurmudgeon在评论中给出的“Hello,world”示例)。

但是再一次,它更多地取决于您相信您的csv格式化得有多好,并且您最好确保在进一步检查之前检测到异常输入。

相关问题