хранить переменные из разделенного табуляцией CSV-файла для каждой строки в Java

Я думаю, что когда вы определяете String, вы определяете объект. Поэтому вам нужно использовать .equals(). Когда вы используете примитивные типы данных, вы используете ==, но с String (и любым объектом) вы должны использовать .equals().

1
задан AtMakeIT 10 March 2019 в 17:08
поделиться

2 ответа

String::split

Я не знаю, как сказать «взять все до табуляции и сохранить его под именем переменной» и «перевести все с табуляции в новую строку и сохранить его в переменной URL» ».

Используйте метод String::split , чтобы нарезать строку на меньшие строки. Укажите разделитель ( TAB ), используемый между полями в каждой строке. Вы получаете обратно массив String объектов, по одному на каждое поле строки.

String[] fields = line.split( "\t" ) ;    // Chop string into smaller strings.
String name = fields[ 0 ] ;               // Annoying zero-based index counting.
String url = fields[ 1 ] ;

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

Подсказка: Используйте библиотеку для рутинной работы по чтению и записи ваших файлов с разделителями табуляции . Для этой работы я использую библиотеку Apache Commons CSV . Он работает с различными форматами CSV , а также с разделителями табуляции. Переполнение стека поиска для примеров, таких как тот, который я опубликовал вчера. В этом примере кода измените CSVFormat.RFC4180 на CSVFormat.TDF для формата с разделителями табуляции.

0
ответ дан Basil Bourque 10 March 2019 в 17:08
поделиться

Я бы использовал другой подход - BufferedReader. С его помощью вы можете получить поток строк файла и работать с каждой строкой отдельно.

import java.io.*;

public class App {

    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("data.tsv"))) {
            reader.lines()                     // Get a stream of lines
                .map(line -> line.split("\t")) // Split every line by the tab character
                .forEach(App::doStuff);        // Call doStuff for every tokenized line
        } catch (IOException e) {
            System.out.println("Cannot open the file.");
        }
    }

    static void doStuff(String[] tokens) {
        if (tokens.length != 2) {
            throw new IllegalArgumentException("Cannot do stuff with an invalid line.");
        }

        String name = tokens[0]; // tokens[0] contains everything before the tab character
        String url = tokens[1];  // tokens[1] contains everything after the tab character

        System.out.printf("%s %s\n", name, url);
    }
}

Если вы действительно хотите использовать Scanner, вы можете указать разделители:

scan = new Scanner(new File(path)).useDelimiter("[\n\t]");

Это позволит сканеру использовать только символы табуляции и символы новой строки в качестве разделителей. Обратите внимание, что это означает, что необязательно, чтобы формат файла был точно таким: «name TAB url NEWLINE name TAB url». Это также может быть «имя NEWLINE url TAB имя TAB url». Это потому, что Scanner не заботится о порядке разделителей.

Если вы действительно хотите использовать Scanner и сохранить строгий формат, вы можете использовать 2 сканера. Отсканируйте строку с первой, затем отсканируйте имя и URL-адрес из строки. Но я думаю, что это слишком сложно, и я бы предпочел использовать BufferedReader, поскольку он сохраняет строгий формат.

0
ответ дан Tolik Pylypchuk 10 March 2019 в 17:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: