【问题标题】:Sorting CSV by column按列对 CSV 进行排序
【发布时间】:2019-08-23 15:40:11
【问题描述】:

所以我正在尝试对到达时间的列进行排序,以便最早的到达时间排在第一位。我对 Java 中的 csv 文件很陌生,所以很挣扎。

我已设法读取 csv 文件并使用数组进行打印,但不确定如何对特定列进行排序

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

public class readCSV {
 public static void main(String[] args) {
    String fileName= "csv.csv";
    File file= new File(fileName);
    // this gives you a 2-dimensional array of strings
    List<List<String>> lines = new ArrayList<>();
    Scanner inputStream;

    try{
        inputStream = new Scanner(file);
        while(inputStream.hasNext()){
            String line= inputStream.next();
            String[] values = line.split(",");
            // this adds the currently parsed line to the 2-dimensional string array
            lines.add(Arrays.asList(values));  
            //System.out.println(line);   
            System.out.println(values[0] + ' ' + values[1] + ' ' + values[2] + ' ' + values[3] ); 
        }
        inputStream.close();
    }catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    // the following code lets you iterate through the 2-dimensional array
    /*int lineNo = 1;
    for(List<String> line: lines) {
    int columnNo = 1;
    for (String value: line) {
    System.out.println("Line " + lineNo + " Column " + columnNo + ": " + value);
    columnNo++;
    }
    lineNo++;
    }*/
 }
}

如果有任何其他改进,例如存储 csv、打印等,我很乐意更改它

这是一个输入示例:

  processID arrivalTime burstTime priority
    1 0 5 1
    2 1 7 2
    3 0 2 1
    4 2 6 2
    5 6 10 3
    6 5 4 4
    7 6 4 7
    8 5 4 8
    9 6 6 3
    10 6 7 2

【问题讨论】:

  • 可能希望将其存储在具有地图 Map 的对象中,并为该对象创建自己的排序方法。这样,当它在列表中时,您可以轻松对其进行排序。 (如果你有时间我会创建代码并上传它作为答案)
  • 是的,我有时间,我会试一试并尝试使用地图进行操作,但非常感谢您查看您的代码
  • 对不起,拖了这么久,但我把答案贴在下面:) 希望对你有帮助!
  • 谢谢,不用担心。我想我明白了,但是我将在哪里使用我拥有的 csv 文件,例如上面的示例
  • 只需将我的部分复制到 'String[] lineValues = s.split(",");'并替换您的 'String[] values ...' 下的部分 :)

标签: java csv operating-system scheduling


【解决方案1】:

我希望下面的代码可以帮助你:)
我所做的,我首先为每一行创建一个对象。 之后,我将每个对象与我想与之比较的那一行的键进行比较。 这样您就可以选择您想要比较的“CSV 密钥”。

您可以使用此代码,但请记住,我在其中放置了 2 个“待办事项”,如果您不考虑它们,这些可能是空指针异常:)

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *
 * @author runef
 */
public class Test {

    public static void main(String[] args) {
        new Test();
    }

    private List<CoolObject> coolObjects = new ArrayList<>();
    private String[] linesOfCSV = {"A,B,C,D", "1,2,A,A", "2,1,B,B"};

    public Test() {
        String[] keys = null;
        for (String s : linesOfCSV) {
            String[] lineValues = s.split(",");
            if (keys == null) {
                keys = lineValues;
            } else {
                Map<String, String> aGoodName = new HashMap<>();
                for (int i = 0; i < lineValues.length; i++) {
                    //TODO: Check if keys[i] exists, check if lineValues[i] exists (if not probs something wrong with CSV)
                    aGoodName.put(keys[i], lineValues[i]);
                }
                coolObjects.add(new CoolObject(aGoodName));
            }
        }
        Collections.sort(coolObjects, new SortByKey("A"));
        System.out.println("SORTED BY KEY 'A'");
        for (CoolObject o : coolObjects) {
            for (Map.Entry<String, String> entry : o.getACoolMap().entrySet()) {
                System.out.print(entry.getKey() + ": " + entry.getValue() + "   ");
            }
            System.out.print("\n");
        }
        Collections.sort(coolObjects, new SortByKey("B"));
        System.out.println("SORTED BY KEY 'B'");
        for (CoolObject o : coolObjects) {
            for (Map.Entry<String, String> entry : o.getACoolMap().entrySet()) {
                System.out.print(entry.getKey() + ": " + entry.getValue() + "   ");
            }
            System.out.print("\n");
        }
    }

    class CoolObject {

        private Map<String, String> aCoolMap;

        public CoolObject(Map<String, String> aCoolMap) {
            this.aCoolMap = aCoolMap;
        }

        public Map<String, String> getACoolMap() {
            return aCoolMap;
        }
    }

    class SortByKey implements Comparator<CoolObject> {

        private String keySorter;

        public SortByKey(String keySorter) {
            this.keySorter = keySorter;
        }

        public int compare(CoolObject a, CoolObject b) {
            //TODO: CHECK IF KEY EXISTS IN BOTH VALUES! ELSE DO SOMETHING ELSE :) PROBS RETURN -1 SO IT COMES LAST!
            return a.getACoolMap().get(this.keySorter).hashCode() - b.getACoolMap().get(this.keySorter).hashCode();
        }
    }
}

【讨论】:

    【解决方案2】:

    这将对一列进行排序..你可以为多列修改它..

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collections;
    
    public class Test {
    
        public static void main(String[] args) throws IOException {
            ArrayList<String> list = new ArrayList<>();
            int lineNumber = 0;
            File csvFile = new File("D://new.csv");
            BufferedReader br = new BufferedReader(new FileReader(csvFile));
            String line = "";
            while ((line = br.readLine()) != null) {
                String[] arr = line.split(",");
                list.add(arr[0]);
                lineNumber++;
            }
            Collections.sort(list);
            list.forEach(i -> System.out.println(i));
        }
    }
    

    【讨论】:

    • 干杯,我的意思是它有点工作。它也对 csv 列的标题进行了排序,并且有 10 个不合适,这是输出:1 10 2 3 4 5 6 7 8 9 processID
    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 2015-12-24
    • 2014-07-06
    • 2021-09-04
    • 2014-10-19
    • 2013-07-10
    • 2017-11-28
    相关资源
    最近更新 更多