Java 以制表符作为引号字符的CSV
我已经尝试了几个用于Java的CSV解析器,但没有一个能够正确处理以下内容:Java 以制表符作为引号字符的CSV,java,csv,Java,Csv,我已经尝试了几个用于Java的CSV解析器,但没有一个能够正确处理以下内容: String str = "\tvalue1\t,,\tv1,",',v3\t,value2" 格式为“逗号”,用制表符分隔为“转义”字符。部分字段为空,部分字段未转义 对处理这种格式的解析器有什么建议吗 例如,我希望将上述字符串解析为: value1 null v1,",',v3 value2 但它产生了以下结果: value1 null v1 " ' v3 value2 Java示例: impo
String str = "\tvalue1\t,,\tv1,",',v3\t,value2"
格式为“逗号”,用制表符分隔为“转义”字符。部分字段为空,部分字段未转义
对处理这种格式的解析器有什么建议吗
例如,我希望将上述字符串解析为:
value1
null
v1,",',v3
value2
但它产生了以下结果:
value1
null
v1
"
'
v3
value2
Java示例:
import java.lang.String;
import com.univocity.parsers.csv.CsvParser;
import com.univocity.parsers.csv.CsvParserSettings;
public class StamMain {
public static void main(String[] args){
String str = "\tvalue1\t,,\tv1,',",v3\t,value2";
System.out.println(str);
CsvParserSettings settings = new CsvParserSettings();
settings.getFormat().setQuote('\t');
CsvParser parser = new CsvParser(settings);
String[] fields = parser.parseLine(str);
for (String f : fields)
System.out.println(f);
}
}
如果用引号代替制表符,效果最好,但引用引号本身就是一项有趣的任务
任何想法都值得赞赏。与
一种选择是:
1) 将字符串中的所有双引号替换为一些您知道不在实际数据中的“好”替换字符串(例如“替换双引号”)
2) 用双引号替换所有选项卡
3) 正常运行解析器
4) 将各个字段中的“Replace_QUOTES_TEMP”字符串(或您选择的任何字符串)替换回实际的双引号。字符串“\tvalue1\t,,\tv1,,,”,v3\t,value2”无效。要将“.”作为字符包含,您需要写入“\”
要分析此代码,请执行以下操作:
字符串st=“\tvalue1\t,,\tv1,\”,”,v3\t,value2”
字符串[]arr=st.split(“\t”) 可以处理得很好
String str = "\tvalue1\t,,\tv1,\",',v3\t,value2";
CSVFormat csvFormat = CSVFormat.DEFAULT.withQuote('\t');
for (CSVRecord record : CSVParser.parse(str, csvFormat))
for (String value : record)
System.out.println(value);
输出
value1
v1,,,v3
价值2
如果需要,您甚至可以添加.withNullString(“”)
以获得该空值
value1
无效的
v1,,,v3
价值2
非常灵活的CSV解析器。只需在解析前添加这一行,即可获得预期的结果:
设置值(假);
这是必需的,因为默认情况下,解析器会删除分隔符周围的空格,但您的“引号”字符恰好是一个空格。无论如何,这是解析器应该处理的事情。我打开了uniVocity解析器的下一个版本来修复它。Hey@Robert。解析结果是什么?(您已经说过正确答案应该是什么,但我们不知道解析器实际产生了什么。)这将有助于诊断问题。:)更新了问题,只是说,
coma
应该是comma
。只是为了让人们更认真地对待你。好吧,这就是它现在的工作方式,但实际的字符串要长得多,每次替换都是性能的损失。这段代码已经运行了数百万行了,当有多个CSV解析器可以执行这项任务时,我们可以进行所有这些工作,例如和?@Andreas这当然是理想的,但是OP提到他已经尝试了几个不适合他的数据的解析器。正在等待带有库链接的代码示例。后续问题:CsvListReader可以接受Reader作为源而不是文件吗?@RobertNavado在这里的示例中,它正在接受读取器
。FileReader
@adas也不起作用:关于“aaa,BBBBBB,\t ccc,ddd\t”
(OP需要3个值,这将产生4个值)aaa BBBBBB ccc ddd split()内的参数指定“按所有\t和,”。谢谢。这是错误的:OP需要[“aaa”、“bbbb”、“ccc、ddd”](3个值)我喜欢这个解决方案。还想发布公共CV:)已在版本上修复。请注意,默认情况下,值将被修剪,因此您将获得“value2”而不是“value2”。如果您仍然想要'value2'禁用trim。我应该做的另一个配置是添加转义和转义字符。我好像问了一个不完整的问题。
value1
null
v1,",',v3
value2
String str = "\tvalue1\t,,\tv1,\",',v3\t,value2";
CSVFormat csvFormat = CSVFormat.DEFAULT.withQuote('\t');
for (CSVRecord record : CSVParser.parse(str, csvFormat))
for (String value : record)
System.out.println(value);