在java中csv的字段值中包含逗号(分隔符为逗号)

问题描述 投票:0回答:4

我想创建一个 csv 文件,其中分隔符以逗号分隔。读取 csv 时,它会以逗号分隔生成 s5 字符串。想要将 s5 字符串保留在单列中。

   String s1="quick";
   String s2="brown";
   String s3="fox";
   String s4="jump";
   String s5="over,the,lazy,dog";


  String csvRecord = String.format("%s,%s,%s,%s,%s", s1,s2,s3,s4,s5);

任何人都可以帮我吗,因为我是弦乐新手。

java string csv delimiter
4个回答
2
投票

我认为你需要将它们添加到双字符串中。

试试这个:

String s5="\"over,the,lazy,dog\"";

0
投票

正如其他答案提到的那样,您实际上必须考虑许多特殊情况,最典型的两种特殊情况是:逗号和双引号。

如 Chewtoy 所附,CSV wiki 已明确指定格式为:

Year,Make,Model,Description,Price
1997,Ford,E350,"ac, abs, moon",3000.00
1999,Chevy,"Venture ""Extended Edition""","",4900.00
1999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.00
1996,Jeep,Grand Cherokee,"MUST SELL!
air, moon roof, loaded",4799.00

要处理这两种情况,您可以尝试以下操作:

public class CsvAddComma {
    public static void main(String... args) {
        List<String> list = new ArrayList<>();
        list.add("quick");
        list.add("over,the,lazy,dog");
        list.add("Venture \"Extended Edition, Very Large\"");
        list.stream()
                .map(s -> convertToCsvFormat(s))
                .forEach(System.out::println);
    }

    private static String convertToCsvFormat(String input) {
        if (input.contains("\"")) {
            input = input.replaceAll("\"", "\"\"");
        }
        if (input.contains(",")) {
            input = String.format("\"%s\"", input);
        }
        return input;
    }
}

输出:

quick
"over,the,lazy,dog"
"Venture ""Extended Edition, Very Large"""

至于其他特殊情况,您需要根据您当前的情况进行处理。也许它们可以被忽略,也许不能。


0
投票

要在数据中包含分隔符,您必须在生成的 csv 中用双引号将该字段引起来:

quick,brown,fox,jump,"over,the,lazy,dog"

如果某些字段中有双引号,则必须转义:

123,"24"" monitor, Samsung",456  // Windows style
123,"24\" monitor",456           // Linux style

您不必引用所有字段,只需引用那些包含分隔符或双引号(或换行符)的字段即可。

有关 csv 通用格式的更多详细信息,请参阅 RFC4180


0
投票

除非你正在做一些作业,否则你绝对需要一个 CSV 库来为你处理这个问题。您还需要关心值中的行结尾和其他引号,而不仅仅是分隔符

使用 univocity-parsers 尝试以下代码:

CsvWriterSettings settings = new CsvWriterSettings();
CsvWriter writer = new CsvWriter(settings);
String result = writer.writeRowToString(s1,s2,s3,s4,s5);

希望这有帮助。

免责声明:我是这个库的作者。它是开源且免费的(Apache 2.0 许可证)

© www.soinside.com 2019 - 2024. All rights reserved.