Количество строк в файле в Java - PullRequest
203 голосов
/ 17 января 2009

Я использую огромные файлы данных, иногда мне нужно знать только количество строк в этих файлах, обычно я открываю их и читаю их построчно, пока не достигну конца файла

Мне было интересно, есть ли более разумный способ сделать это

Ответы [ 18 ]

2 голосов
/ 29 марта 2013

Как насчет использования класса Process из Java-кода? А затем читая вывод команды.

Process p = Runtime.getRuntime().exec("wc -l " + yourfilename);
p.waitFor();

BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
int lineCount = 0;
while ((line = b.readLine()) != null) {
    System.out.println(line);
    lineCount = Integer.parseInt(line);
}

Нужно попробовать, хотя. Опубликуем результаты.

1 голос
/ 30 августа 2016

Это забавное решение действительно хорошо работает!

public static int countLines(File input) throws IOException {
    try (InputStream is = new FileInputStream(input)) {
        int count = 1;
        for (int aChar = 0; aChar != -1;aChar = is.read())
            count += aChar == '\n' ? 1 : 0;
        return count;
    }
}
1 голос
/ 17 января 2009

Если у вас нет структур индекса, вы не сможете обойтись без чтения всего файла. Но вы можете оптимизировать его, избегая читать его построчно и использовать регулярное выражение для сопоставления со всеми разделителями строк.

0 голосов
/ 10 октября 2017

Лучший оптимизированный код для многострочных файлов, не имеющих символа новой строки ('\ n') в EOF.

/**
 * 
 * @param filename
 * @return
 * @throws IOException
 */
public static int countLines(String filename) throws IOException {
    int count = 0;
    boolean empty = true;
    FileInputStream fis = null;
    InputStream is = null;
    try {
        fis = new FileInputStream(filename);
        is = new BufferedInputStream(fis);
        byte[] c = new byte[1024];
        int readChars = 0;
        boolean isLine = false;
        while ((readChars = is.read(c)) != -1) {
            empty = false;
            for (int i = 0; i < readChars; ++i) {
                if ( c[i] == '\n' ) {
                    isLine = false;
                    ++count;
                }else if(!isLine && c[i] != '\n' && c[i] != '\r'){   //Case to handle line count where no New Line character present at EOF
                    isLine = true;
                }
            }
        }
        if(isLine){
            ++count;
        }
    }catch(IOException e){
        e.printStackTrace();
    }finally {
        if(is != null){
            is.close();    
        }
        if(fis != null){
            fis.close();    
        }
    }
    LOG.info("count: "+count);
    return (count == 0 && !empty) ? 1 : count;
}
0 голосов
/ 17 января 2009

Единственный способ узнать, сколько строк в файле - это подсчитать их. Конечно, вы можете создать метрику на основе ваших данных, давая вам среднюю длину в одну строку, а затем получить размер файла и разделить его с помощью avg. длина, но это не будет точно.

0 голосов
/ 13 декабря 2010

если вы используете это

public int countLines(String filename) throws IOException {
    LineNumberReader reader  = new LineNumberReader(new FileReader(filename));
    int cnt = 0;
    String lineRead = "";
    while ((lineRead = reader.readLine()) != null) {}

    cnt = reader.getLineNumber(); 
    reader.close();
    return cnt;
}

Вы не можете запускать строки с большим числом, нравится 100K строк, потому что return от reader.getLineNumber равно int. вам нужен длинный тип данных для обработки максимального количества строк ..

0 голосов
/ 26 февраля 2019

Сканер с регулярным выражением:

public int getLineCount() {
    Scanner fileScanner = null;
    int lineCount = 0;
    Pattern lineEndPattern = Pattern.compile("(?m)$");  
    try {
        fileScanner = new Scanner(new File(filename)).useDelimiter(lineEndPattern);
        while (fileScanner.hasNext()) {
            fileScanner.next();
            ++lineCount;
        }   
    }catch(FileNotFoundException e) {
        e.printStackTrace();
        return lineCount;
    }
    fileScanner.close();
    return lineCount;
}

Не разобрались.

0 голосов
/ 17 января 2009

В Unix-системах используйте команду wc в командной строке.

...