【问题标题】:How to NOT count control characters in a text file如何不计算文本文件中的控制字符
【发布时间】:2016-03-03 18:08:34
【问题描述】:

我无法理解如何不计算文本文件中的控制字符。除了跳过控制字符\n \r,我的程序什么都做: 文件内容:好的,经过进一步的尝试,我离得更近了。如果我改变:

 while (input.hasNext()) { 
          String line = input.nextLine();
          lineCount++;
          wordCount += countWords(line);
          charcount += line.length(); 
 to
 while (input.hasNext()) {
          String line = input.next();
          lineCount++;
          wordCount += countWords(line);
          charCount += line.replace("\n", "").replace("\r", "").length();

字符被计算在内,但它弄乱了线条。如果我添加 input.nextLine 它会弄乱字符。 文本文件的内容:

伤心的狗
狗摇摆

import java.io.*;
import java.util.*;

public class Character_count {

 public static void main(String args[]) throws Exception {

     java.io.File file = new java.io.File("textFile.txt");

        // Create a Scanner for the file
        Scanner input = new Scanner(file);
        int charcount = 0;
        int wordCount = 0;
        int lineCount = 0;

        while (input.hasNext()) {
          String line = input.nextLine();
          lineCount++;
          wordCount += countWords(line);
          charcount += line.length();
        }


        System.out.println("The file " + file + " has ");
        System.out.println(charcount + " characters");
        System.out.println(wordCount + " words");
        System.out.println(lineCount + " lines");

        }

    private static int countWords(String s) {
        Scanner input = new Scanner(s);
            int count = 0;

        while (input.hasNext()) {
            input.next(); 
        count++;
        }
        return count;

  }
}

【问题讨论】:

  • 对于字符计数,请尝试在计数之前将 line 中的回车符和换行符替换为空。类似charcount += line.replace("\n", "").replace("\r", "").length()
  • 这对我不起作用

标签: java text io java.util.scanner delimiter


【解决方案1】:

您可以像这样用空字符串替换所有\n\r

line = line.replaceAll("\\r?\\n", "")

现在您可以进行计数,它不会考虑任何\n\r

您也可以这样做(不使用正则表达式):

line = line.replace("\n", "").replace("\r", "")

【讨论】:

  • @jake 显示一些它不起作用的示例输入和输出。
【解决方案2】:

您可以使用Scanner 方法通过useDelimiter 方法实现这一目标:

Scanner input = new Scanner(new File("textFile.txt"));
input.useDelimiter("\r\n");

然后像往常一样继续你的代码,应该可以工作。

另外(并且非常重要)如果您检查hasNext(),则使用next(),如果您检查hasNextLine(),请使用nextLine()!不要混搭,因为这会导致(或已经导致)问题。

【讨论】:

  • 这对我不起作用。它仍然计算空间。这在我的阅读中提到但非常模糊
  • 你是否也应用了“Also”之后的部分(使用hasNextLine()而不是hasNext()?)
  • 没有骰子。在我问这个问题之前我有这样的事情,但无论我做什么都是行不通的
  • 啊,我再想想。也请在您的问题中发布您的File 的内容
  • 您在使用我的分隔符之前和之后是否注意到count任何 差异?还是完全一样?
【解决方案3】:

您好,您应该在表示空格的正则表达式中使用“\s”

\s 代表“空白字符”。同样,这实际上包括哪些字符,取决于正则表达式的风格。在本教程中讨论的所有风格中,它都包括 [ \t\r\n\f]。即:\s 匹配空格、制表符、换行符或换页符。(http://www.regular-expressions.info/shorthand.html)

所以这里你如何使用它

Scanner scanner = new Scanner(path.toFile(),"UTF-8");
    String content = scanner.useDelimiter("\\A").next();
    System.out.println(content);

    Pattern patternLine = Pattern.compile("\\r?\\n");
    Matcher matcherLine = patternLine.matcher(content);
    int numberLines = 1;
    while (matcherLine.find())
        numberLines++;


    Pattern pattern = Pattern.compile("\\s");
    Matcher matcherEliminateWhiteSpace = pattern.matcher(content);
    String contentWithoutWhiteSpace=matcherEliminateWhiteSpace.replaceAll("");


    // it will count only ASCII Charachter a->z A->Z 0->9 _'underscore'
    Pattern patternCharachter=Pattern.compile("\\w");
    Matcher matcherCharachterAscii= patternCharachter.matcher(contentWithoutWhiteSpace);


    int numberCharachtersAscii = 0;
    while (matcherCharachterAscii.find())
        numberCharachtersAscii++;
    //it will count UTF-8 charachters it will count all charachter no matter what script it is like français عربي and punctuation
Pattern patternUniversal= Pattern.compile(".");
    Matcher matcherUniversal= patternUniversal.matcher(contentWithoutWhiteSpace);
    int numberUniversalCharachter=0;
    while(matcherUniversal.find())
    numberUniversalCharachter++;
    System.out
            .println("******************************************************");
    System.out.println(contentWithoutWhiteSpace);
    System.out.println(numberLines);
    System.out.println(numberCharachtersAscii);
    System.out.println(numberUniversalCharachter);
  • 编辑

这是一个简单的修改,可以让它工作

        while (scanner.hasNext()) {
          String line = scanner.nextLine();
          lineCount++;
          wordCount += countWords(line);
          charcount += word.replaceAll("\\s", "").length();
          System.out.println(charcount);
          i++;
    }

\\s 代表空格[tab cariagReturn lineFeed space formFeed]

【讨论】:

  • 我认为这对于我正在使用的东西来说还远远不够。
  • 省略 UTF-8 字符计数的部分,您只需删除 petternUniversal 及其附带的内容即可完成
  • 告诉我你想要什么,我会让它变得简单
  • 你能看看我对我的代码的更正吗?我很接近
  • 好的,我去看看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2020-12-15
  • 2021-07-11
  • 1970-01-01
  • 2014-04-26
相关资源
最近更新 更多