使用BufferedReader与Scanner解析CSV文件

时间:2014-04-06 16:00:00

标签: java

团队,我必须逐行解析文件,在单行中我已经拆分了“,”。 First String是Name,Second是count。最后我必须显示Key和Count 例如

Peter,2 
Smith,3
Peter,3
Smith,5

我应该表现为彼得5和史密斯8。

所以我很困惑在BufferedReader和Scanner之间做出选择。经过link。我想出了这两种方法。我想得到你的担忧。

方法1:使用缓冲的阅读器。

private HashMap<String, MutableLong> readFile(File file) throws IOException {
        final HashMap<String, MutableLong> keyHolder = new HashMap<>();
        try (BufferedReader br = new BufferedReader(new InputStreamReader(
                new FileInputStream(file), "UTF-8"))) {
            for (String line; (line = br.readLine()) != null;) {
                // processing the line.
                final String[] keyContents = line
                        .split(KeyCountExam.COMMA_DELIMETER);
                if (keyContents.length == 2) {
                    final String keyName = keyContents[0];
                    final long count = Long.parseLong(keyContents[1]);
                    final MutableLong keyCount = keyHolder.get(keyName);
                    if (keyCount != null) {
                        keyCount.add(count);
                        keyHolder.put(keyName, keyCount);
                    } else {
                        keyHolder.put(keyName, new MutableLong(count));
                    }
                }

            }
        }
        return keyHolder;
    }

private static final String COMMA_DELIMETER = ",";
    private static volatile Pattern commaPattern = Pattern
            .compile(COMMA_DELIMETER);

我使用过MutableLong(因为我不想每次创建BigInteger。再次,它可能是一个非常大的文件,我无法控制密钥的最大可能性

另一种方法:

使用扫描仪并使用两个分隔符

private static final String LINE_SEPARATOR_PATTERN = "\r\n|[\n\r\u2028\u2029\u0085]";
    private static final String LINE_PATTERN = ".*(" + LINE_SEPARATOR_PATTERN
            + ")|.+$";
    private static volatile Pattern linePattern = Pattern.compile(LINE_PATTERN);

我的问题是。我已经浏览了扫描仪中的hasNext,对我来说切换模式没有坏处。而且我相信Java 7,Scanner确实有限的缓冲区就足够了这种文件。

在方法1中做任何一个更好的方法2,还是除此之外我们还有其他选择。我只是为了测试目的而做了。显然,方法1中的相同代码将取代此处。在Approach1中使用split将创建多个String实例。这可以通过扫描char序列来避免(我是对的)。

private HashMap<String, BigInteger> readFileScanner(File file)
            throws IOException {
        final HashMap<String, BigInteger> keyHolder = new HashMap<>();
        try (Scanner br = new Scanner(file, "UTF-8")) {
            while (br.hasNext()) {
                br.useDelimiter(commaPattern);
                System.out.println(br.next());
                System.out.println(br.next());
                br.useDelimiter(linePattern);
            }
        }
        return keyHolder;
    }

0 个答案:

没有答案