我有一个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();
}
}
}
答案 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(新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方法并比较了两个字符串,它们是逗号(,)之后每个句子中的第三个字符串,并将它们转换为数字并按排序顺序排列。