验证文件中的意外空行

时间:2014-04-21 05:23:30

标签: java newline

除此之外:我正在使用penn.txt文件来解决问题。这里的链接是我的Dropbox,但它也可以在其他地方使用,例如here。但是,我还没有检查它们是否完全一样。

问题陈述:我想对penn.txt文件的每一行进行一些文字处理,其中包含一些单词和句法类别。细节无关紧要。

实际"问题" face:我怀疑该文件有一些连续的空白行(理想情况下不应该存在),我认为代码验证但我没有通过眼睛验证它,因为行数有点大(〜 1300000)。所以我希望检查我的Java代码和结论的正确性。

我使用了converting file to Stringcounting number of lines in a string的略微修改的代码版本。我不确定分裂的效率,但它适用于这种情况。

File file = new File("final_project/penn.txt"); //location
System.out.println(file.exists());

//converting file to String 
byte[] encoded = null;
try { 
    encoded = Files.readAllBytes(Paths.get("final_project/penn.txt"));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String mystr = new String(encoded, StandardCharsets.UTF_8);

//splitting and checking "consecutiveness" of \n    
for(int j=1; ; j++){
    String split = new String();
    for(int i=0; i<j; i++){
        split = split + "\n";
    }
    if(mystr.split(split).length==1) break;
    System.out.print("("+mystr.split(split).length + "," + j + ") ");
}

//counting using Scanner
int count=0;
try {
    Scanner reader = new Scanner(new FileInputStream(file));
        while(reader.hasNext()){
            count++;
            String entry = reader.next();
            //some word processing here
        }
    reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println(count);

Gedit中的行数 - 如果我理解正确 - 与1,283,169处的\n个字符的数量匹配。我已经(单独)验证了\r\r\n(组合)字符的数量是0,使用相同的拆分思路。总拆分输出如下所示:

(1283169,1)(176,2)(18,3)(13,4)(11,5)(9,6)(8,7)(7,8)(6,9)(6) ,10)(5,11)(5,12)(4,13)(4,14)(4,15)(4,16)(3,17)(3,18)(3,19)(3) ,20)(3,21)(3,22)(3,23)(3,24)(3,25)(2,26)(2,27)(2,28)(2,29)(2) ,30)(2,31)(2,32)(2,33)(2,34)(2,35)(2,36)(2,37)(2,38)(2,39)(2) ,40)(2,41)(2,42)(2,43)(2,44)(2,45)(2,46)(2,47)(2,48)(2,49)(2) ,50)

请回答以下陈述是否正确:

  1. 据此,我理解的是有一个50个连续\n个字符的实例,因此有两个25个连续\n字符的实例,依此类推。
  2. 最后一次计数(使用扫描仪)读数给出1,282,969这是200的精确差异。在我看来,这意味着在文件的某处有正好200条(或199?)空行。
  3. 有没有办法单独核实这个&#34;差异&#34; 200?(类似于交叉点的集合理论计算)

1 个答案:

答案 0 :(得分:0)

问题的部分答案(最后一部分)如下:

(假设问题中的两个陈述是真的)

如果您打印否,则不是打印分割部件的数量。发生\n次j次,你得到(只做-1):

(1283168,1)(175,2)(17,3)(12,4)(10,5)(8,6)(7,7)(6,8)(5,9)(5) ,10)(4,11)(4,12)(3,13)(3,14)(3,15)(3,16)(2,17)(2,18)(2,19)(2) ,20)(2,21)(2,22)(2,23)(2,24)(2,25)(1,26)(1,27)(1,28)(1,29)(1) ,30)(1,31)(1,32)(1,33)(1,34)(1,35)(1,36)(1,37)(1,38)(1,39)(1) ,40)(1,41)(1,42)(1,43)(1,44)(1,45)(1,46)(1,47)(1,48)(1,49)(1) ,50)

请注意,对于j> 3,两个数字的乘积都是&lt; = 50,这是您的最大值。这意味着有一个地方有50个连续\n个字符,你从4到49获得的所有命中实际上都是同一部分。

然而对于3,3小于50的最大倍数是48,这里给出16,而你在这里有17次。因此,在其两侧都有一个非\n\n\n字符的额外\n

现在为2(\n\n),我们可以减去25(来自50 \n s)和1(来自单独的\n\n\n)以获得175-26 = 149 。

计算差异,我们应该总结(2-1)* 149 +(3-1)* 1 +(50-1)* 1,-1来,因为这些中的第一个\n在扫描仪计数中计算。这笔钱是200.