使用Java对CSV文件中的列进行排序

时间:2015-04-22 19:07:30

标签: java sorting csv

我有一个CSV文件可以读取它。

City,Job,Salary
Delhi,Doctors,500
Delhi,Lawyers,400
Delhi,Plumbers,100
London,Doctors,800
London,Lawyers,700
London,Plumbers,300
Tokyo,Doctors,900
Tokyo,Lawyers,800
Tokyo,Plumbers,400
Lawyers,Doctors,300
Lawyers,Lawyers,400
Lawyers,Plumbers,500
Hong Kong,Doctors,1800
Hong Kong,Lawyers,1100
Hong Kong,Plumbers,1000
Moscow,Doctors,300
Moscow,Lawyers,200
Moscow,Plumbers,100
Berlin,Doctors,800
Berlin,Plumbers,900
Paris,Doctors,900
Paris,Lawyers,800
Paris,Plumbers,500
Paris,Dog catchers,400`

现在,我想对Salary列进行排序并将其写入txt文件。

我可以访问该列,但无法对其进行排序。我是Java的这个CSV阅读部分的新手。有人可以帮忙!我应该如何将每个工资值存储到变量中。

import java.io.*;

public class Main {

    public static void main(String args[]) throws FileNotFoundException
    {
        String csv="C:\\Users\\Dipayan\\Desktop\\salaries.csv";
        BufferedReader br= new BufferedReader(new FileReader(csv));
        String line="";

        try {
            br.readLine();

            while((line = br.readLine())!=null)
            {
                String[] f=line.split(",");
                System.out.println(" Salary ="+f[2]);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

4 个答案:

答案 0 :(得分:1)

你可以试试像 -

String csv="/home/user/Desktop/salaries.csv";
BufferedReader br= new BufferedReader(new FileReader(csv));
String line;
Map<Integer, String> salaryMap = new TreeMap<Integer, String>();

try {
    br.readLine();
    while((line = br.readLine()) != null) {
        salaryMap.put(Integer.parseInt(line.split(",")[2]), line);
    }
} catch (IOException e) {
    e.printStackTrace();
}


try {
    FileWriter fw = new FileWriter("/home/user/Desktop/salaries.txt");
    BufferedWriter bw = new BufferedWriter(fw);
    List<String> list = new ArrayList<String>(salaryMap.values());
    for (String str : list) {
        bw.write(str);
        bw.newLine();
    }

    bw.flush();
    bw.close();

} catch (IOException e) {
    e.printStackTrace();
}

答案 1 :(得分:0)

我认为你应该在这里使用地图,或者可能是

List<Integer, String> 

如果是地图

 Map<Integer,String>

其中key是薪水,字符串是整个行。 让我写一些代码来帮助你。

 Map<Integer,String> dataMap = new HashMap<Integer,String>();
 String row = br.readLine();
 String columns[]=row.split(","); // columns[2] has the salary now
 dataMap.add(Integer.valueOf(columns[2]),row);

使用冒泡排序来查看内容或客户比较类以对地图进行排序。检查Collection Api的可能排序功能。

You can use even List<Integer,String>

相对于整数排序,将元素放在实际位置并重新生成文件。

编辑: 您可以使用树图,因为它会对数据进行排序。只需使用整数的Treemap作为键,使用string作为值。将所有值放入其中并迭代它,这就是全部!

答案 2 :(得分:0)

小心地图,put会覆盖以前的值。

您可以使用将对本机数组进行排序或使用guavas的Arrays.sort Iterables.sortedCopy

这是Arrays.sort的代码库:http://codebunk.com/b/40731608/

答案 3 :(得分:0)

Java NIO

  • Java提供了第二个名为NIO(新I / O)的I / O系统。

  • 开发NIO是为了允许Java程序员在不使用自定义本机代码的情况下实现高速I / O. NIO将耗时的I / O活动(如填充,即排空缓冲等)移回操作系统,从而大大提高了操作速度。

    import java.io.File;
    
    import java.nio.charset.Charset;
    import java.nio.file.Files;
    import java.nio.file.Path;
    
    import java.util.List;
    

    // ...

    Path filePath = new File("csv_file_path").toPath();
    Charset charset = Charset.defaultCharset();        
    List<String> stringList = Files.readAllLines(filePath, charset);
    String[] stringArray = stringList.toArray(new String[]{});
    
    
    Arrays.sort(stringArray, new Comparator<String>(){
        public int compare(String first, String second) {
            return Integer.valueOf(first.split(",")[2]).compareTo(Integer.valueOf(second.split(",")[2]));
        }
    });
    
    for (String newstr: stringArray){
        System.out.println(newstr);
    }
    

以上代码中使用的软件包: -

  • java.nio.charset : - 它封装了字符集,还支持编码器和解码器操作,分别将字符转换为字节,字节转换为字符。

  • java.nio.file : - 它提供对文件的支持。

使用的方法: -

  • toPath(): - (无参数)

    此方法返回从此抽象路径构造的java.nio.file.Path对象。 异常 : - InvalidPathException - 如果无法从抽象路径构造Path对象(请参阅FileSystem.getPath)

    示例: -

    File file = new File("C:\\sandbox\\test.txt");
    System.out.println(file.toPath());
    
    Output:- C:\sandbox\test.txt 
    

    注意: - 必须为上述代码添加例外

  • defaultCharset(): - (无参数)

    此方法返回此Java虚拟机的默认字符集。

  • 公共静态列表&lt; String&gt; readAllLines(Path path,Charset cs): -

    参数( 路径 - 文件的路径, cs - 用于解码的字符集)

    此方法将文件中的所有行读作List。

现在,我已经使用toArray()方法将List转换为数组,并实现了一个用于对数组进行排序的Comparator。 我重写了compare方法并比较了两个字符串,它们是逗号(,)之后每个句子中的第三个字符串,并将它们转换为数字并按排序顺序排列。