另外:我正在使用penn.txt文件解决此问题。 此处的链接指向我的Dropbox,但在此处等其他地方也可以使用。 但是,我没有检查它们是否完全相同。

问题陈述:我想对penn.txt文件的每一行进行一些文字处理,其中包含一些文字和句法类别。 详细信息不相关。

面临的实际“问题”:我怀疑文件有一些连续的空行(理想情况下不应出现),我认为代码可以验证,但我没有亲眼所见,因为行数有点大(〜 1,300,000)。 因此,我希望检查我的Java代码和结论的正确性。

我已经使用了经过稍微修改的代码版本,用于将文件转换为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中的行数与找到的\\n字符数为1,283,169相匹配。 我已经使用相同的分割思路(分别)验证了\\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?)个空行。

有什么方法可以单独验证200的“差异”吗? (可能类似于对交集的理论计算)

===============>>#1 票数: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,两个数字的乘积为<= 50,这是您的最大值。 这意味着一个地方有50个连续的\\n字符,而您从4到49的所有匹配实际上都是相同的一部分。

但是,对于3,小于50的3的最大倍数是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。

  ask by cutculus translate from so

未解决问题?本站智能推荐: