Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以制表符作为引号字符的CSV_Java_Csv - Fatal编程技术网

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

我已经尝试了几个用于Java的CSV解析器,但没有一个能够正确处理以下内容:

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);