java里csv格式对齐_如何在Java中按两列对csv文件进行排序?

尽管创建类作为域的适当表示形式通常是一个好主意:在这种情况下,我不同意注释.

读取CSV并将其按一列或多列的(字符串内容)排序是一种非常通用的操作.并且它独立于域.

可以实现一种比较器,该比较器简单地在List< String>的几个索引处选择字符串,并按字典顺序比较这些索引处的值.使用该比较器,可以对任何List< List< String>>进行排序.从CSV文件读取的文件.

这是一个简单的例子.它可用于根据任意列的字符串内容对任何CSV文件进行排序.

import java.io.BufferedReader;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.io.Writer;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

public class MultiColumnCsvSort

{

private static final String COLUMN_SEPARATOR = ",";

public static void main(String[] args) throws Exception

{

InputStream inputStream = new FileInputStream("sample-input.csv");

List> lines = readCsv(inputStream);

// Create a comparator that sorts primarily by column 0,

// and if these values are equal, by column 2

Comparator> comparator = createComparator(0, 2);

Collections.sort(lines, comparator);

OutputStream outputStream = new FileOutputStream("output.csv");

String header = "Symbol, Exchange, Minimum, Average, Maximum, Total";

writeCsv(header, lines, outputStream);

}

private static List> readCsv(

InputStream inputStream) throws IOException

{

BufferedReader reader = new BufferedReader(

new InputStreamReader(inputStream));

List> lines = new ArrayList>();

// Skip header

String line = reader.readLine();

while (true)

{

line = reader.readLine();

if (line == null)

{

break;

}

List list = Arrays.asList(line.split(COLUMN_SEPARATOR));

lines.add(list);

}

return lines;

}

private static void writeCsv(

String header, List> lines, OutputStream outputStream)

throws IOException

{

Writer writer = new OutputStreamWriter(outputStream);

writer.write(header+"

");

for (List list : lines)

{

for (int i = 0; i < list.size(); i++)

{

writer.write(list.get(i));

if (i < list.size() - 1)

{

writer.write(COLUMN_SEPARATOR);

}

}

writer.write("

");

}

writer.close();

}

private static > Comparator>

createComparator(int... indices)

{

return createComparator(MultiColumnCsvSort.naturalOrder(), indices);

}

private static > Comparator

naturalOrder()

{

return new Comparator()

{

@Override

public int compare(T t0, T t1)

{

return t0.compareTo(t1);

}

};

}

private static Comparator> createComparator(

final Comparator super T> delegate, final int... indices)

{

return new Comparator>()

{

@Override

public int compare(List list0, List list1)

{

for (int i = 0; i < indices.length; i++)

{

T element0 = list0.get(indices[i]);

T element1 = list1.get(indices[i]);

int n = delegate.compare(element0, element1);

if (n != 0)

{

return n;

}

}

return 0;

}

};

}

}

几年后更新:

如果要在各个列的排序顺序方面具有更大的灵活性,可以使用不同的选项.哪一个是“最佳”,很大程度上取决于您要如何“组装”实际的比较器-也就是说,您要如何定义应按哪个顺序对哪一列进行排序.但是,这里显示了一个简单的示例:

import java.io.BufferedReader;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.io.Writer;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

public class MultiColumnCsvSortExtended

{

private static final String COLUMN_SEPARATOR = ",";

public static void main(String[] args) throws Exception

{

InputStream inputStream = new FileInputStream("sample-input.csv");

List> lines = readCsv(inputStream);

// Create a comparator that compares the elements from column 0,

// in ascending order

Comparator> c0 = createAscendingComparator(0);

// Create a comparator that compares the elements from column 2,

// in descending order

Comparator> c1 = createDesendingComparator(2);

// Create a comparator that compares primarily by using c0,

// and secondarily by using c1

Comparator> comparator = createComparator(c0, c1);

Collections.sort(lines, comparator);

OutputStream outputStream = new FileOutputStream("output.csv");

String header = "Symbol, Exchange, Minimum, Average";

writeCsv(header, lines, outputStream);

}

private static List> readCsv(

InputStream inputStream) throws IOException

{

BufferedReader reader = new BufferedReader(

new InputStreamReader(inputStream));

List> lines = new ArrayList>();

String line = null;

// Skip header

line = reader.readLine();

while (true)

{

line = reader.readLine();

if (line == null)

{

break;

}

List list = Arrays.asList(line.split(COLUMN_SEPARATOR));

lines.add(list);

}

return lines;

}

private static void writeCsv(

String header, List> lines, OutputStream outputStream)

throws IOException

{

Writer writer = new OutputStreamWriter(outputStream);

writer.write(header+"

");

for (List list : lines)

{

for (int i = 0; i < list.size(); i++)

{

writer.write(list.get(i));

if (i < list.size() - 1)

{

writer.write(COLUMN_SEPARATOR);

}

}

writer.write("

");

}

writer.close();

}

@SafeVarargs

private static Comparator

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 > Comparator>

createAscendingComparator(int index)

{

return createListAtIndexComparator(Comparator.naturalOrder(), index);

}

private static > Comparator>

createDesendingComparator(int index)

{

return createListAtIndexComparator(Comparator.reverseOrder(), index);

}

private static Comparator>

createListAtIndexComparator(Comparator super T> delegate, int index)

{

return (list0, list1) ->

delegate.compare(list0.get(index), list1.get(index));

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值