CSV файл в ArrayList, сортировка по 2 различным столбцам и печать - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть CSV-файл, каждая строка которого отформатирована как: 20 символов строки, 10 символов строки, 4 строки символов и двойной тип.

Цель состоит в том, чтобы прочитать файл и сохранить информацию в коллекции списков. .

затем сортируйте с использованием компаратора в 3-м столбце, а затем в 1-м столбце.

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

System.out.printf("%-20s%-10s%-4s%10s%n", Result.get(0), Result.get(1), Result.get(2), Result.get(3));

, что я попытался, но не мог отобразить без необходимости "System.out.println (CSVtoArrayList (Line));" линия. мой текущий код:

public static void main(String[] args) {

    BufferedReader Buffer = null;

    try {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter file name: ");
        String input1 = scanner.nextLine(); 
        String Line;
        Buffer = new BufferedReader(new FileReader(input1));

        while ((Line = Buffer.readLine()) != null) {
            System.out.println(CSVtoArrayList(Line));

            }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (Buffer != null) Buffer.close();
        } catch (IOException Exception) {
            Exception.printStackTrace();
        }
    }
}


public static ArrayList<String> CSVtoArrayList(String CSV) {
    ArrayList<String> Result = new ArrayList<String>();

    if (CSV != null) {
        String[] splitData = CSV.split("\\s*,\\s*");
        for (int i = 0; i < splitData.length; i++) {
            if (!(splitData[i] == null) || !(splitData[i].length() == 0)) {
                Result.add(splitData[i].trim());

            }
        }
    }

    return Result;

}

в настоящее время он печатает что-то вроде:

Enter file name: 
comma.txt
[frist movei, Bob, 1999, 24.98]
[first mobie, Steve, 1999, -345.67]
[first movie, Pam, 1999, 0.00]
[other moive, Sam, 1562, -42.16]
[something, Sue, 8951, 224.62]

1 Ответ

0 голосов
/ 08 апреля 2020

я начал с нуля, и с помощью кода я нашел:

Как отсортировать CSV-файл по двум столбцам в java?

я добился требуемых результатов

private static final String COLUMN_SEPARATOR = ",";

public static void main(String[] args) throws Exception
{
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter file name: ");
    String input1 = scanner.nextLine(); 
    String csvFile = input1;
    InputStream inputStream = new FileInputStream(input1);
    List<List<String>> lines = readCsv(inputStream);
    Comparator<List<String>> c2 = createAscendingComparator(2);
    Comparator<List<String>> c0 = createAscendingComparator(0);
    Comparator<List<String>> comparator = createComparator(c2, c0);
    Collections.sort(lines, comparator);
    printCsv(lines);        
}

private static List<List<String>> readCsv(
    InputStream inputStream) throws IOException
{
    BufferedReader reader = new BufferedReader(
        new InputStreamReader(inputStream));
    List<List<String>> lines = new ArrayList<List<String>>();

    String line = null;

    while (true)
    {
        line = reader.readLine();
        if (line == null)
        {
            break;
        }
        List<String> list = Arrays.asList(line.split(COLUMN_SEPARATOR));
        lines.add(list);
    }
    return lines;
}

private static void printCsv(List<List<String>> lines) 
    throws IOException
{

    for (List<String> list : lines)
    {
        System.out.printf("%-20s%-10s%-4s%10s%n", list.get(0),list.get(1),list.get(2), list.get(3));

    }

}

private static <T> Comparator<T>
    createComparator(Comparator<? super T>... delegates)
{
    return (t0, t1) -> 
    {
        for (Comparator<? super T> delegate : delegates)
        {
            int n = delegate.compare(t0, t1);
            if (n != 0)
            {
                return n;
            }
        }
        return 0;
    };
}

private static <T extends Comparable<? super T>> Comparator<List<T>>
    createAscendingComparator(int index)
{
    return createListAtIndexComparator(Comparator.naturalOrder(), index);
}

private static <T extends Comparable<? super T>> Comparator<List<T>>
    createAscendingComparator1(int index)
{
    return createListAtIndexComparator(Comparator.naturalOrder(), index);
}

private static <T> Comparator<List<T>>
    createListAtIndexComparator(Comparator<? super T> delegate, int index)
{
    return (list0, list1) -> 
        delegate.compare(list0.get(index), list1.get(index));
}
...