0

我正在尝试创建一个程序,它使用正则表达式从目录中读取 CSV 文件,它解析文件的每一行并在匹配正则表达式模式后显示这些行。例如,如果这是我的 csv 文件的第一行

1997,Ford,E350,"ac, abs, moon",3000.00

我的输出应该是

1997 Ford E350 ac, abs, moon 3000.00

我不想使用任何现有的 CSV 库。我不擅长正则表达式,我使用了我在网上找到的一个正则表达式,但它在我的程序中不起作用这是我的源代码,如果有人告诉我在哪里以及我需要修改什么,我将不胜感激为了使我的代码工作。请解释一下。

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.regex.Pattern;
import java.util.regex.Matcher;


public class RegexParser {

private static Charset charset = Charset.forName("UTF-8");
private static CharsetDecoder decoder = charset.newDecoder();
String pattern = "\"([^\"]*)\"|(?<=,|^)([^,]*)(?=,|$)";

void regexparser( CharBuffer cb)
{ 
    Pattern linePattern = Pattern.compile(".*\r?\n");
    Pattern csvpat = Pattern.compile(pattern);
    Matcher lm = linePattern.matcher(cb);
    Matcher pm = null;

    while(lm.find())
    {   
        CharSequence cs = lm.group();
        if (pm==null)
            pm = csvpat.matcher(cs);
            else
                pm.reset(cs);
        if(pm.find())
                     {

            System.out.println( cs);
                      }
        if (lm.end() == cb.limit())
        break;

        }

    }

public static void main(String[] args) throws IOException {
    RegexParser rp = new RegexParser();
    String folder = "Desktop/sample";
    File dir = new File(folder);
    File[] files = dir.listFiles();
    for( File entry: files)
    {
        FileInputStream fin = new FileInputStream(entry);
        FileChannel channel = fin.getChannel();
        int cs = (int) channel.size();
        MappedByteBuffer mbb = channel.map(FileChannel.MapMode.READ_ONLY, 0, cs);
        CharBuffer cb = decoder.decode(mbb);
        rp.regexparser(cb);
        fin.close();

    }




}

  }

这是我的输入文件

年份,制造,型号,描述,价格

1997,福特,E350,”ac,abs,moon”,3000.00

1999,雪佛兰,“冒险”“加长版”“”,“”,4900.00

1999,雪佛兰,“Venture”“加长版,非常大”“”,“”,5000.00

1996,吉普,大切诺基,“必须卖!

空气, 月顶, 装载",4799.00

我得到的输出与我的代码中的问题在哪里?为什么我的正则表达式对代码没有任何影响?

4

4 回答 4

2

使用 regexp 似乎“花哨”,但使用 CSV 文件(至少在我看来)是不值得的。对于我的解析,我使用http://commons.apache.org/csv/。它从来没有让我失望过。:)

于 2012-09-16T10:46:38.430 回答
1

无论如何,我自己找到了解决方法,谢谢大家的建议和帮助。

这是我的初始代码

    if(pm.find()
        System.out.println( cs);

现在将其更改为

  while(pm.find()
  {
 CharSequence css = pm.group();
 //print css
   }

我也使用了不同的正则表达式。我现在得到了想要的输出。

于 2012-09-17T15:00:11.543 回答
0

你可以试试这个:[ \t]*+"[^"\r\n]*+"[ \t]*+|[^,\r\n]*+用这个代码:

try {
    Pattern regex = Pattern.compile("[ \t]*+\"[^\"\r\n]*+\"[ \t]*+|[^,\r\n]*+", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE | Pattern.MULTILINE);
    Matcher matcher = regex.matcher(subjectString);
    while (matcher.find()) {
        // Do actions
    } 
} catch (PatternSyntaxException ex) {
    // Take care of errors
}

但是,是的,如果这不是一个非常关键的需求,请尝试使用已经工作的东西:)

于 2012-09-16T10:23:12.697 回答
0

接受所提供的建议,不要使用正则表达式来解析 CSV 文件。该格式的使用方式看似复杂。

以下答案包含指向 wikipedia 和描述 CSV 文件格式的 RFC 的链接:

于 2012-09-16T21:15:22.953 回答