обрабатывать большой CSV-файл на уровне транзакции - PullRequest
0 голосов
/ 11 апреля 2019

Я должен работать над обработкой большого файла CSV (~ 1 ГБ), как показано ниже, с использованием Java.

Trans1, 1, 2, 3, 4
Trans1, 2, 3, 4, 5
Trans1, 4, 5, 2, 1
Trans2, 1, 2, 3, 4
Trans2, 2, 3, 4, 5
Trans2, 4, 5, 2, 1
Trans2, 1, 2, 3, 4
Trans3, 2, 3, 4, 5
Trans3, 4, 5, 2, 1

Первые 3 строки принадлежат одной транзакции, следующие 4 - одной транзакции. Я должен прочитать пакет транзакций может быть 1000 за один раз. Когда я читаю файл, он должен заканчиваться последней строкой этой транзакции.

Каков наилучший способ сделать это с использованием Java, считайте лучшую производительность?

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

1 Ответ

0 голосов
/ 11 апреля 2019

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

StringBuilder sb = new StringBuilder();
int trans = -1;

try (BufferedReader br = Files.newBufferedReader(Paths.get("transactions.csv"))) {
    String line;
    while ((line = br.readLine()) != null) {
        String[] parts = line.split(",\\s*");
        int transCurr = Integer.parseInt(parts[0].replace("Trans", ""));
        if (transCurr != trans && trans != -1) {
            // process the transaction just read in
            sb = new StringBuilder();
        }
        trans = transCurr;
        sb.append(line).append("\n");
    }

}
catch (IOException e) {
    System.err.format("IOException: %s%n", e);
}

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

...