文件中字符出现的计数/频率分布,包括不可见字符



我的目标是创建大型平面文件(1GB以上)中每个字符的频率分布,以便以后导入数据库。理想情况下,输出将是一个ASCII字符列表,每个字符后跟一个计数。

我目前正在使用hashmap来创建字符串中每个值的分布,它有点工作,我只是不确定如何在大文件上实现这一点。此外,在我的输出中,CR和LF(或/r/n)字符会产生一个新的行,其计数在下一行。

下面是当前代码:

public class CharCount{
public static void main(String[] args) {
String s = "abcdefghijklmnopqrstuvwxyz1234567890,.)(/\<>?!@#$%^&*_-+=rn";
char[] arr = s.toCharArray();
HashMap <Character,Integer> count = new HashMap<Character, Integer>();
for (char c : arr) {
try {
count.put(c, count.get(c)+1);
} catch (NullPointerException e) {
count.put(c, 1);
}
}
for (Character c: count.keySet()) {
System.out.println(c + " = " + (int)c + " = " + count.get(c));
}
}
}

理想的输出是这样的:

000 NUL 4124435001 SOH 0
002 STX 0
003 ETX 0

…253 ý 0
254 þ 0
255°0

非常感谢任何帮助!

如果您只处理ASCII字符,即在0-255范围内,那么使用整数(或长)数组[256]将更简单,然后读取文件,实际上,每次读取一个字符(当然,您将使用缓冲或NIO来提高速度)并增加适当的bin。

也就是说,你的HashMap代码看起来很合理,我不确定你的问题是什么?

如果您确定只处理ASCII数据,那么使用int[256]数组而不是散列映射来实现将快得多

关于rn,就像处理空格下面的其他字符一样处理它们。(您可能也应该像这样处理空格–通过打印其名称而不是字符本身。)

最新更新