繁体   English   中英

当几列中有行分隔值而不是逗号分隔时,如何拆分 csv 文件

[英]How to split csv file when there is line seperated value in few columns instead of comma separated

我正在逐行读取逗号分隔的文件。 但是很少有列具有行分隔值而不是逗号,并且我收到 IndexOutOfBoundsException 错误。 有没有办法解决它?


 if (latestRoleFile != null) {
        String rePattern = "(\"[^\",]++),([^\"]++\")";
        Pattern pattern = Pattern.compile(rePattern);
        String fileLocation = directoryLocation + "\\" + latestRoleFile;
        File file = new File(fileLocation);
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file);
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
            String line = null;
            br.readLine();
            while ((line = br.readLine()) != null) {

                Matcher matcher = pattern.matcher(line);
                if (matcher.find()) {
                    String newString = line.replaceAll(rePattern, "$1|$2");
                    line = newString;
                    line = line.replace("\"", "");
                }

                String[] chunks = line.split(",");
                String subRoleId = chunks[0];
                String subSubscriberId = chunks[1];
                String name = chunks[2];
                HashMap innerMap = new HashMap();
                innerMap.put("SubRoleId", subRoleId);
                innerMap.put("SubSubscriberId", subSubscriberId);
                innerMap.put("Name", name);
                subRoleData.put(subRoleId, innerMap);
            }
        } catch (IOException e) {
            System.out.println(e.getLocalizedMessage());
        }
    }

示例文件是:

    6,1,"Senior Claims Specialist 1","In active role ",False
    7,1,"Underwriter","Lisandra Noto, Melissa, Alanna, Jared, Chris, Dana, Bieloh,Ben, Samantha ",True
    8,1,"AVP Lead Underwriter","Bechel, William
    Hatutale, Anneline
    Johnson, Kirsten
    Markovich, Daniel
    Nace, Patti
    Sullivan, Zachary
    Toohey, Felicia
    Woodward, Mark",True
    9,1,"VP, Underwriting Operations ","Beckie Wendorf",True

我在使用 3rd 方库(例如opencsv )处理格式良好的 csv 文件方面取得了很多成功。 尝试制作 DIY csv 解析器时可能会出现很多问题。

import com.opencsv.CsvReader;

...

CSVReader reader = new CSVReader(new FileInputStream(file));
String[] line;
while ((line = reader.readNext()) != null) {
    HashMap innerMap = new HashMap();
    innerMap.put("SubRoleId", line[0);
    innerMap.put("SubSubscriberId", line[1]);
    innerMap.put("Name", line[2]);
    subRoleData.put(line[0], innerMap);
}

假设无论出于何种原因,您都无法导入 jar 文件并使用其中的类,那么您将不得不采用一种更容易出错的技术。 假设您的输入文件没有任何转义引号,您可以检查一行中的引号数。 如果数字不是偶数,则意味着会有尾随数据,因此您需要阅读下一行。

这是一些可以提供帮助的代码。 我还没有运行测试,这段代码只是让你知道你能做什么。

public int countQuotes(String string) {
    int count = 0;
    for (int i = 0; i < string.length(); i++) {
        if (string.charAt(i) == '"')
            count++;
    }
    return count;
}

public String getNextLine(BufferedReader reader) {
    try {
        String multiLine = "";
        do {
            String line = reader.readLine();
            if (line == null)
                return null;
            multiLine += line;
        } while (countQuotes(multiLine) % 2 != 0);
        return multiLine;
    } catch (IOException e) {
        return null;
    }
}

您现在可以在循环中调用 getNextLine 并且至少知道返回的每个字符串将包含偶数个引号。 当 getNextLine 返回 null 时,文件已完成处理。 请注意,如果 csv 文件格式不正确(有未终止的引号),此解决方案将不会返回最后一行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM