在Java中使用模式解析
我想使用parsingMethod解析文件的行 test.csv在Java中使用模式解析,java,regex,string,parsing,csv,Java,Regex,String,Parsing,Csv,我想使用parsingMethod解析文件的行 test.csv Frank George,Henry,Mary / New York,123456 ,Beta Charli,"Delta,Delta Echo ", 25/11/1964, 15/12/1964,"40,000,000.00",0.0975,2,"King, Lincoln ",Alpha 这是我读台词的方式 public static void main(String[] args) throws Exception {
Frank George,Henry,Mary / New York,123456
,Beta Charli,"Delta,Delta Echo
", 25/11/1964, 15/12/1964,"40,000,000.00",0.0975,2,"King, Lincoln ",Alpha
这是我读台词的方式
public static void main(String[] args) throws Exception {
File file = new File("C:\\Users\\test.csv");
BufferedReader reader = new BufferedReader(new FileReader(file));
String line2;
while ((line2= reader.readLine()) !=null) {
String[] tab = parsingMethod(line2, ",");
for (String i : tab) {
System.out.println( i );
}
}
}
public static String[] parsingMethod(String line,String parser) {
List<String> liste = new LinkedList<String>();
String patternString ="(([^\"][^"+parser+ "]*)|\"([^\"]*)\")" +parser+"?";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher =pattern.matcher(line);
while (matcher.find()) {
if(matcher.group(2) != null){
liste.add(matcher.group(2).replace("\n","").trim());
}else if(matcher.group(3) != null){
liste.add(matcher.group(3).replace("\n","").trim());
}
}
String[] result = new String[liste.size()];
return liste.toArray(result);
}
}
我想删除此“,
有谁能帮我改进我的模式吗
预期产量
Frank George
Henry
Mary / New York
123456
Beta Charli
Delta
Delta Echo
25/11/1964
15/12/1964
40,000,000.00
0.0975
2
King
Lincoln
Alpha
Delta
Delta Echo
第3行的输出
25/11/1964
15/12/1964
40
000
000.00
0.0975
2
King
Lincoln
我无法复制你的结果,但我想也许你想把第二个捕获组的引号去掉,如下所示:
"(([^\"][^"+parser+ "]*)|\"([^\"]*))\"" +parser+"?"
编辑:对不起,这不起作用。也许你想让第一组中的任何数量的
^\“
,比如:([^,\“]*)\\”([^\“]*)\”,
你的代码没有正确编译,但这是由于一些“
没有被转义造成的
但这应该可以做到:
String patternString = "(?:^.,|)([^\"]*?|\".*?\")(?:,|$)";
Pattern pattern = Pattern.compile(patternString, Pattern.MULTILINE);
(?:^.,|)
是一个非捕获组,它匹配行首的单个字符
([^\“]*?\”*?“*?\”
是一个捕获组,它匹配除“以外的所有内容”或“两者之间的任何内容”
(?:,|$)
是与行尾或逗号匹配的非捕获组
注意:
^
和$
仅在使用pattern.MULTILINE标志编译模式时按说明工作。因为我可以看到行是相关的,所以请尝试以下操作:
public static void main(String[] args) throws Exception {
File file = new File("C:\\Users\\test.csv");
BufferedReader reader = new BufferedReader(new FileReader(file));
StringBuilder line = new StringBuilder();
String lineRead;
while ((lineRead = reader.readLine()) != null) {
line.append(lineRead);
}
String[] tab = parsingMethod(line.toString());
for (String i : tab) {
System.out.println(i);
}
}
public static String[] parsingMethod(String line) {
List<String> liste = new LinkedList<String>();
String patternString = "(([^\"][^,]*)|\"([^\"]*)\"),?";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
if (matcher.group(2) != null) {
liste.add(matcher.group(2).replace("\n", "").trim());
} else if (matcher.group(3) != null) {
liste.add(matcher.group(3).replace("\n", "").trim());
}
}
String[] result = new String[liste.size()];
return liste.toArray(result);
}
作为Delta,Delta Echo在引号中,这应该出现在同一行!就像King,Lincoln一样,这是如何编译的?您正在为patternString分配一个strigns数组。
String patternString=“(([^\”][^“,”]*)\([^\“]*)\”,“?”;
这段代码没有编译,您在:String PatternStrinstringString=“(([^\],“],”)上有一个错误([^\"]*)\")","?"琼:我不擅长模式字符串。但是这段代码可以编译。我从控制台复制了输出。@RicardoCacheira:我不擅长模式字符串。但是这段代码可以编译。我从控制台复制了输出。阿纳纳说,你必须替换双反斜杠,但即使你这样做,程序也不会返回输出。我试过了。我没有在模式中。现在我已经更正了我的代码()请参见问题。我将您的模式字符串放入了我的代码中。它给我错误`java.lang.IndexOutOfBoundsException:No group 2`此模式一次返回一个组,因此没有组2。要检查是否有组要签出matcher.groupCount()
如果您真的想拥有多个组,请使用以下命令:String patternString=“(?:(?:^.,|))([^\”*?\“*?”*?*?\”(:,|$)+”;
(我没有测试这个,但我应该可以工作)@B8rede:不工作相同的errore java.lang.IndexOutOfBoundsException:没有组2使用if(matcher.groupCount()>=2){.lister.add(matcher.group)(2).replace(“\n”,”).trim();}如果(matcher.groupCount()>=3){liste.add(matcher.group(3).replace(“\n”,”).trim();}
它将检查是否有第2组,如果有,请使用它。第3组也一样。很抱歉,我不明白你在说什么。如果我的解决方案不起作用,我相信其他人会费心用勺子将其发送给你。我请求你检查我的代码。我的代码中有patternString,我无法解析“。我想删除”“还有。对于您的PatternString,我的输出类似于,、000.00,问题是我无法复制您的结果。在将第3行传递给parserMethod时,您可以输出它吗?如果您将其更改为此([^,\“]*)|\”([^\“]*)\”),?
?这对我来说毫无意义。请尝试输出第3行,以便我可以重现您的结果。我指的不是输出,而是输入,即作为parseMethod()参数提供的字符串你的模式字符串和我的PatternString是相同的。只有当你把文件内容看作一个字符串时,这才是输出。你必须逐行读取文件并把它发送给PARSETHORD。对不起,伙计,但是你告诉我,在第3行的引号上标出了接近于第2行的引文,所以它告诉我这些行是相关的。d、 如果不是的话,你不知道你想要什么!!!是的,第3行的开头与第2行开始的引语很接近。但这是第3行,我必须分别分析每一行。这就是为什么我阅读每一行并使用该方法进行分析。很抱歉不清楚。希望你现在理解并帮助我解决这个问题。这对我来说没有意义我,但好吧!为了讲清楚,你能告诉我这是什么行以及你想做什么吗?我将尝试帮助你在test.csv中生成哪些行?
public static void main(String[] args) throws Exception {
File file = new File("C:\\Users\\test.csv");
BufferedReader reader = new BufferedReader(new FileReader(file));
StringBuilder line = new StringBuilder();
String lineRead;
while ((lineRead = reader.readLine()) != null) {
line.append(lineRead);
}
String[] tab = parsingMethod(line.toString());
for (String i : tab) {
System.out.println(i);
}
}
public static String[] parsingMethod(String line) {
List<String> liste = new LinkedList<String>();
String patternString = "(([^\"][^,]*)|\"([^\"]*)\"),?";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
if (matcher.group(2) != null) {
liste.add(matcher.group(2).replace("\n", "").trim());
} else if (matcher.group(3) != null) {
liste.add(matcher.group(3).replace("\n", "").trim());
}
}
String[] result = new String[liste.size()];
return liste.toArray(result);
}
Frank George
Henry
Mary / New York
123456
Beta Charli
Delta,Delta Echo
25/11/1964
15/12/1964
40,000,000.00
0.0975
2
King, Lincoln
Alpha