2016-03-07 81 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格式化得有多好,並且您最好確保在進一步檢查之前檢測到異常輸入。

相關問題