繁体   English   中英

计算文件中的字符,单词和行数

[英]count characters, words and lines in file

这应该将行数,单词数和字符数计入文件中。

但这是行不通的。 从输出中它仅显示0

码:

public static void main(String[] args) throws IOException {
    int ch;
    boolean prev = true;        
    //counters
    int charsCount = 0;
    int wordsCount = 0;
    int linesCount = 0;

    Scanner in = null;
    File selectedFile = null;
    JFileChooser chooser = new JFileChooser();
    // choose file 
    if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
        selectedFile = chooser.getSelectedFile();
        in = new Scanner(selectedFile);         
    }

    // count the characters of the file till the end
    while(in.hasNext()) {
        ch = in.next().charAt(0);
        if (ch != ' ') ++charsCount;
        if (!prev && ch == ' ') ++wordsCount;
        // don't count if previous char is space
        if (ch == ' ') 
            prev = true;
        else 
            prev = false;

        if (ch == '\n') ++linesCount;
    }

    //display the count of characters, words, and lines
    charsCount -= linesCount * 2;
    wordsCount += linesCount;
    System.out.println("# of chars: " + charsCount);
    System.out.println("# of words: " + wordsCount);
    System.out.println("# of lines: " + linesCount);

    in.close();
}

我不明白发生了什么。 有什么建议么?

您的代码仅查看文件中默认标记(单词)的前几个字符。

当您执行ch = in.next().charAt(0) ,它将获取令牌的第一个字符(单词),然后扫描程序将前进至下一个令牌(跳过该令牌的其余部分)。

不同的方法。 使用字符串查找行数,单词数和字符数:

public static void main(String[] args) throws IOException {
        //counters
        int charsCount = 0;
        int wordsCount = 0;
        int linesCount = 0;

        Scanner in = null;
        File selectedFile = null;
        JFileChooser chooser = new JFileChooser();
        // choose file 
        if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
            selectedFile = chooser.getSelectedFile();
            in = new Scanner(selectedFile);
        }

        while (in.hasNext()) {
            String tmpStr = in.nextLine();
            if (!tmpStr.equalsIgnoreCase("")) {
                String replaceAll = tmpStr.replaceAll("\\s+", "");
                charsCount += replaceAll.length();
                wordsCount += tmpStr.split(" ").length;
            }
            ++linesCount;
        }

        //display the count of characters, words, and lines
        System.out.println("# of chars: " + charsCount);
        System.out.println("# of words: " + wordsCount);
        System.out.println("# of lines: " + linesCount);

        in.close();
    }


注意:
对于其他编码样式,请使用new Scanner(new File(selectedFile), "###"); 代替new Scanner(selectedFile);

###是需要设置的字符。 引用这个维基

这里有几个问题。

首先是对行尾的测试将导致问题,因为它通常不是表示行尾的单个字符。 请阅读http://en.wikipedia.org/wiki/在线结尾,以获取有关此问题的更多详细信息。

单词之间的空白字符不仅可以是ASCII 32(空格)值。 将制表符视为一种情况。 您想要检查Character.isWhitespace()的可能性更高。

您也可以使用如何使用扫描仪检查行尾中的两个扫描仪来解决行尾问题

这是您与输入和输出一起提供的代码的快速技巧。

import java.io.*;
import java.util.Scanner;
import javax.swing.JFileChooser;

public final class TextApp {

public static void main(String[] args) throws IOException {
    //counters
    int charsCount = 0;
    int wordsCount = 0;
    int linesCount = 0;

    Scanner fileScanner = null;
    File selectedFile = null;
    JFileChooser chooser = new JFileChooser();
    // choose file 
    if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
        selectedFile = chooser.getSelectedFile();
        fileScanner = new Scanner(selectedFile);         
    }

    while (fileScanner.hasNextLine()) {
      linesCount++;
      String line = fileScanner.nextLine();
      Scanner lineScanner = new Scanner(line);
      // count the characters of the file till the end
      while(lineScanner.hasNext()) {
        wordsCount++;
        String word = lineScanner.next();
        charsCount += word.length();
      } 

    lineScanner.close();
  }

  //display the count of characters, words, and lines
  System.out.println("# of chars: " + charsCount);
  System.out.println("# of words: " + wordsCount);
  System.out.println("# of lines: " + linesCount);

  fileScanner.close();
 }
}

这是测试文件输入:

$ cat ../test.txt 
test text goes here
and here

这是输出:

$ javac TextApp.java
$ java TextApp 
# of chars: 23
# of words: 6
# of lines: 2
$ wc test.txt 
 2  6 29 test.txt

字符计数之间的差异是由于不计算空白字符,这似乎是您在原始代码中尝试执行的操作。

希望对您有所帮助。

您可以将每行存储在List<String> ,然后将linesCount = list.size()

计算charsCount

for(final String line : lines)
    charsCount += line.length();

计算wordsCount

for(final String line : lines)
    wordsCount += line.split(" +").length;

将这些计算组合在一起而不是单独进行计算,可能是一个明智的想法。

使用Scanner方法:

int lines = 0;
int words = 0;
int chars = 0;
while(in.hasNextLine()) {
    lines++;
    Scanner lineScanner = new Scanner(in.nextLine());
    lineScanner.useDelimiter(" ");
    while(lineScanner.hasNext()) {
        words++;
        chars += lineScanner.next().length();
    }
}

似乎每个人都在建议您另一种选择,

逻辑上的缺陷是,您没有遍历整行的所有字符。 您只是循环浏览每行的第一个字符。

 ch = in.next().charAt(0);

另外, charsCount -= linesCount * 2; 代表?

您可能还希望在访问文件时包括try-catch块。

  try {
            in = new Scanner(selectedFile);
        } catch (FileNotFoundException e) {}

也许我的代码可以帮助您...一切正常

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
import java.util.StringTokenizer;

public class LineWordChar {
    public static void main(String[] args) throws IOException {
        // Convert our text file to string
    String text = new Scanner( new File("way to your file"), "UTF-8" ).useDelimiter("\\A").next();
    BufferedReader bf=new BufferedReader(new FileReader("way to your file"));
    String lines="";
    int linesi=0;
    int words=0;
    int chars=0;
    String s="";
    // while next lines are present in file int linesi will add 1
        while ((lines=bf.readLine())!=null){
        linesi++;}
    // Tokenizer separate our big string "Text" to little string and count them
    StringTokenizer st=new StringTokenizer(text);
     while (st.hasMoreTokens()){
        `enter code here`  s = st.nextToken();
          words++;
    // We take every word during separation and count number of char in this words    
          for (int i = 0; i < s.length(); i++) {
              chars++;}
        }
     System.out.println("Number of lines: "+linesi);
     System.out.println("Number of words: "+words);
     System.out.print("Number of chars: "+chars);
 }
}
public class WordCount {

    /**
     * @return HashMap a map containing the Character count, Word count and
     *         Sentence count
     * @throws FileNotFoundException 
     *
     */
    public static void main() throws FileNotFoundException {
        lineNumber=2; // as u want
        File f = null;
        ArrayList<Integer> list=new ArrayList<Integer>();

        f = new File("file.txt");
        Scanner sc = new Scanner(f);
        int totalLines=0;
        int totalWords=0;
        int totalChars=0;
        int totalSentences=0;
        while(sc.hasNextLine())
        {
            totalLines++;
            if(totalLines==lineNumber){
                String line = sc.nextLine();
                totalChars += line.length();
                totalWords += new StringTokenizer(line, " ,").countTokens();  //line.split("\\s").length;
                totalSentences += line.split("\\.").length;
                break;
            }
            sc.nextLine();

        }

        list.add(totalChars);
        list.add(totalWords);
        list.add(totalSentences);
        System.out.println(lineNumber+";"+totalWords+";"+totalChars+";"+totalSentences);

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM