gpt4 book ai didi

java - 读取写得不好的csv

转载 作者:行者123 更新时间:2023-12-01 06:14:39 25 4
gpt4 key购买 nike

我的 csv 写得不好:

标题是:

"xxx"|"yyy"|"zzz"|"nnn"|"...."

所以我尝试创建一个扫描仪并在管道上拆分:

Scanner scanner   = new Scanner(new File("myCsv.csv"));
int first = 1;
String line;
String row[];
while(scanner.hasNextLine()){
line = scanner.nextLine();
row = line.split("\\|");
if(first==1){
first = 0;
continue;
}
...
}

不幸的是,在 csv 的一列中我发现了一个新行,因此“nextLine”不是获取整行的好方法。

另一个问题是管道存在于列内..类似于:

"field1"|"field|2"|"field3\n"|"..."

所以我认为解析 csv 的最佳方法是创建一个与 ".."|".." 字符串匹配的正则表达式模式。

有人可以帮助我吗?

谢谢!

最佳答案

因为您的 csv 不包含任何转义双引号,所以我建议您进行匹配而不是拆分。

"(?s)\".*?\""

(?s) 称为 dotall 修饰符,它使模式中的点匹配偶数换行符。

DEMO

String s = "\"xxx\"|\"yyy|bar\"|\"zzz\"|\"nn\n" + 
"n\"|\"....\"";
Matcher m = Pattern.compile("(?s)\".*?\"").matcher(s);
while(m.find())
{
System.out.println(m.group(0));
}

输出:

"xxx"
"yyy|bar"
"zzz"
"nn
n"
"...."

如果您不想在最终输出中使用双引号,请使用捕获组。

String s = "\"xxx\"|\"yyy|bar\"|\"zzz\"|\"nn\n" + 
"n\"|\"....\"";
Matcher m = Pattern.compile("(?s)\"(.*?)\"").matcher(s);
while(m.find())
{
System.out.println(m.group(1));
}

输出:

xxx
yyy|bar
zzz
nn
n
....

关于java - 读取写得不好的csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27598273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com