Как изменить код для чтения всех типов файлов с разделителями? В настоящее время он читает только CSV-файлы, а затем сравнивает их - PullRequest
1 голос
/ 25 июня 2019

csv1

ID, Имя 1, Крис 2, Джош 3, Сэм 4, Питер

CSV2 ID, Имя 1, Крис 2, Ральф 3, Стэн 4, Боб

package com.company;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Diff {

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

        ArrayList<String> values1 = new ArrayList<String>();
        ArrayList<String> values2 = new ArrayList<String>();
        File sheet1 = new File("C:\\Users\\Krisesh.Kanchi\\Documents\\csv1.csv");
        File sheet2 = new File("C:\\Users\\Krisesh.Kanchi\\Documents\\csv2.csv");

        Scanner scanner1 = new Scanner(sheet1);
        Scanner scanner2 = new Scanner(sheet2);

        scanner1.nextLine();
        while (scanner1.hasNextLine()) {
             values1.add(scanner1.nextLine().split(",")[1]);
    }

    scanner2.nextLine();
    while (scanner2.hasNextLine()) {
        values2.add(scanner2.nextLine().split(",")[1]);
    }

    int iteration = 0;

    System.out.printf("%-6s%-6s%-6s\n","Sheet-1", "    ", "Sheet-2");
    System.out.println();

    for (String value : values1) {
        if(values1.get(iteration).compareToIgnoreCase(values2.get(iteration)) != 0) {
            System.out.printf("%-7s%-6s%-7s\n",values1.get(iteration), " --> ", values2.get(iteration));
        }
        iteration++;
    }
}

}

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

1 Ответ

0 голосов
/ 25 июня 2019

Отдельный не ответ: вы этого не делаете. Если у вас нет много времени под рукой.

Видите ли: парсинг произвольных CSV-файлов намного сложнее, чем вы думаете. Самописный синтаксический анализатор CSV работает именно с теми входными файлами, с которыми вы изначально тестировали его. Как только вы протестируете его с некоторыми действительными CSV из другого источника, есть вероятность, что он потерпит неудачу. (и да: был там, сделал это)

Все начинается с очень простой вещи: вы не можете просто разделить на вашем разделителе. Вы видите:

"a string, with a comma","another string, another comma"

является действительным контентом CSV. Итак: вы должны внимательно следить за цитаты.

Следующим, конечно, является возможность автоматически обрабатывать различные конкретные типы, такие как разбор даты / времени и т. Д.

Таким образом: если вам нужен парсер CSV для реальной системы, рассмотрите возможность использования одного из существующих библиотечных решений, например opencsv . Не изобретайте велосипед, если нет веских причин для этого.

(Да, изучение того, как это сделать, могло бы быть хорошей причиной. Необходимость в синтаксическом анализаторе CSV нет, как другие люди написали один для вас давным-давно.)

Сказав, что: ваш текущий код жесткое кодирование все, что может / должно быть параметры в командной строке:

  • имена файлов для анализа
  • разделитель для использования

Итак, чтобы ответить на заданный вопрос: не вставляйте такие параметры непосредственно в код. Разрешите пользователю устанавливать их динамически, например, передавая их в командной строке.

Но опять же: это именно то, что инструмент реального мира предлагает вам бесплатно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...