java - 使用 OpenCSV 根据特定行值查找 csv 文件的确切部分

标签 java csv opencsv

我有一个 CSV 文件,我正在使用 OpenCSV 解析该文件。 。 CSV 文件如下所示:

delta,theta,signal_1,signal_2,signal_3,signal_4,signal_5,signal_6,value_1,value_2,death 71239,56366,8654,21170,16053,27229,5835,8834,3.511244,3.511244,0 234145,160964,16164,20320,29410,17088,9041,8885,5.473104,4.165198,0 76576,23670,11216,22239,8831,15797,13216,7872,2.680331,2.380573,0 44504,39475,12008,18694,14639,25165,11716,24879,2.696564,2.685185,0 275603,31948,10360,7867,15249,16791,8526,4918,2.095088,2.490662,0 80893,16847,7368,19869,5425,11039,6720,5553,3.105438,2.632364,0 70494,323693,61661,3887,17667,35640,16069,8686,18.3219,9.953226,1 808498,57853,13771,15957,13831,20629,15981,11177,4.18285,10.971,1 900628,263343,38948,48837,11122,12378,29276,25673,23.67767,15.39414,1 306369,11836,12448,16708,14225,38644,56110,24842,0.8320562,9.564192,1 2337196,354879,28332,94271,31804,40325,27890,35445,11.15831,11.88935,1 129047,45750,2640,13725,6823,17161,8363,8970,6.705262,6.231878,1 275603,31948,10360,7867,15249,16791,8526,4918,2.095088,2.490662,2 80893,16847,7368,19869,5425,11039,6720,5553,3.105438,2.632364,2 80494,312693,61261,3887,17667,35640,16069,8686,18.3219,9.953226,2 990628,123343,12948,48837,11122,12378,29276,25673,23.67767,15.39414,2 886369,56836,12348,16708,14225,38644,56110,24842,0.8320562,9.564192,2 4437196,234879,34532,94271,31804,40325,27890,35445,11.15831,11.88935,2

这里,最后一列是死亡值,并且在某些行之后不断增加(这完全是任意的)。我想找到第一例死亡发生在哪一行,并将前 3 行写入一个单独的 csv 文件。所以在这里,第一例死亡发生在

70494,323693,61661,3887,17667,35640,16069,8686,18.3219,9.953226,1

所以我将考虑前三行:

44504,39475,12008,18694,14639,25165,11716,24879,2.696564,2.685185,0 275603,31948,10360,7867,15249,16791,8526,4918,2.095088,2.490662,0 80893,16847,7368,19869,5425,11039,6720,5553,3.105438,2.632364,0

并将它们写入单独的 CSV 文件(假设这是 newCSV.csv)。将对 Death = 2 和 Death = 3 执行相同操作,并将它们继续附加到 newCSV.csv 文件中。 我可以使用 OpenCSV 逐行读取它们,但不知道如何根据死亡值检测行。任何帮助将不胜感激。

最佳答案

这是您的完整解决方案,

你的主要逻辑,

FileInputStream fin = new FileInputStream("C/inputFile.csv");
        FileOutputStream fout = new FileOutputStream("C/newCSV.csv");

        BufferedReader br = new BufferedReader(new InputStreamReader(fin));

        MyObject[] last3MyObject = new MyObject[3];
        int index = 0;
        String str = br.readLine();//read Filed Header Value...
        String fieldHeader = str;
        fout.write(fieldHeader.getBytes());//write header into output file...

        str = br.readLine();

        int currentDeathValue = 0;
        int previousDeathValue = 0;

        while(str != null){

            MyObject myObject = new MyObject();

            String [] tkn = str.split(",");

            myObject.setDelta(Long.parseLong(tkn[0]));
            myObject.setTheta(Long.parseLong(tkn[1]));
            myObject.setSignal_1(Long.parseLong(tkn[2]));
            myObject.setSignal_2(Long.parseLong(tkn[3]));
            myObject.setSignal_3(Long.parseLong(tkn[4]));
            myObject.setSignal_4(Long.parseLong(tkn[5]));
            myObject.setSignal_5(Long.parseLong(tkn[6]));
            myObject.setSignal_6(Long.parseLong(tkn[7]));
            myObject.setValue_1(Double.parseDouble(tkn[8]));
            myObject.setValue_2(Double.parseDouble(tkn[9]));

            currentDeathValue = Integer.parseInt(tkn[10]);

            if(currentDeathValue != previousDeathValue){
                for(MyObject mylast3Object  : last3MyObject){

                    fout.write(mylast3Object.toString().getBytes());
                    fout.write("\n".getBytes());
                }
            }

            previousDeathValue = currentDeathValue;

            myObject.setDeath(currentDeathValue);

            if(index == 3){
                index = 0;
            }

            last3MyObject[index++] = myObject; 

            str = br.readLine();

创建一个 Bean 类,例如,

class MyObject{

    private long delta;
    private long theta;
    private long signal_1;
    private long signal_2;
    private long signal_3;
    private long signal_4;
    private long signal_5;
    private long signal_6;
    private double value_1;
    private double value_2;
    private int death;
    public long getDelta() {
        return delta;
    }
    public void setDelta(long delta) {
        this.delta = delta;
    }
    public long getTheta() {
        return theta;
    }
    public void setTheta(long theta) {
        this.theta = theta;
    }
    public long getSignal_1() {
        return signal_1;
    }
    public void setSignal_1(long signal_1) {
        this.signal_1 = signal_1;
    }
    public long getSignal_2() {
        return signal_2;
    }
    public void setSignal_2(long signal_2) {
        this.signal_2 = signal_2;
    }
    public long getSignal_3() {
        return signal_3;
    }
    public void setSignal_3(long signal_3) {
        this.signal_3 = signal_3;
    }
    public long getSignal_4() {
        return signal_4;
    }
    public void setSignal_4(long signal_4) {
        this.signal_4 = signal_4;
    }
    public long getSignal_5() {
        return signal_5;
    }
    public void setSignal_5(long signal_5) {
        this.signal_5 = signal_5;
    }
    public long getSignal_6() {
        return signal_6;
    }
    public void setSignal_6(long signal_6) {
        this.signal_6 = signal_6;
    }
    public double getValue_1() {
        return value_1;
    }
    public void setValue_1(double value_1) {
        this.value_1 = value_1;
    }
    public double getValue_2() {
        return value_2;
    }
    public void setValue_2(double value_2) {
        this.value_2 = value_2;
    }
    public int getDeath() {
        return death;
    }
    public void setDeath(int death) {
        this.death = death;
    }

    @Override
    public String toString() {
        return this.delta+","+this.theta+","+this.signal_1+","+this.signal_2+","+this.signal_3+","+this.signal_4+","+this.signal_5+","+this.signal_6+","+this.value_1+","+this.value_2+","+this.death;
    }

}

已编辑...

while(str != null){
            //System.out.println("IN");
            MyObject myObject = new MyObject();

            String [] tkn = str.split(",");

            myObject.setDelta(Long.parseLong(tkn[0]));
            myObject.setTheta(Long.parseLong(tkn[1]));
            myObject.setSignal_1(Long.parseLong(tkn[2]));
            myObject.setSignal_2(Long.parseLong(tkn[3]));
            myObject.setSignal_3(Long.parseLong(tkn[4]));
            myObject.setSignal_4(Long.parseLong(tkn[5]));
            myObject.setSignal_5(Long.parseLong(tkn[6]));
            myObject.setSignal_6(Long.parseLong(tkn[7]));
            myObject.setValue_1(Double.parseDouble(tkn[8]));
            myObject.setValue_2(Double.parseDouble(tkn[9]));
            currentDeathValue = Integer.parseInt(tkn[10]);
            myObject.setDeath(currentDeathValue);

            if(flag && (previousDeathValue == currentDeathValue)){
                if(index < 3){
                    last3MyObject[index++] = myObject;
                }else{
                    flag = false;
                    for(MyObject mylast3Object  : last3MyObject){
                        System.out.println(mylast3Object);
                        fout.write(mylast3Object.toString().getBytes());
                        fout.write("\n".getBytes());
                    }

                }
            }

            if(currentDeathValue != previousDeathValue){
                flag = true;
                index = 0;
            }

            previousDeathValue = currentDeathValue;

            str = br.readLine();
        }

关于java - 使用 OpenCSV 根据特定行值查找 csv 文件的确切部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33951582/

相关文章:

c - 在 C 中逐行读取 X&Y 坐标并将它们存储在不同的数组中

java - 将 Opencsv jar 添加到项目后出现 NoClassDefFoundError

java - 用引号将文本写入 CSV,但不使用引号写入数值

Java 如何向下载的 CSV 添加新的空列

java - 'isGooglePlayServicesAvailable'(this) 已弃用

java - 我不明白比较

python - 如何将 CSV 文件与 Pandas 结合(并添加识别列)

python - 如何使用 MIME/SMTP 和电子邮件附加 CSV 文件?

java - 如何从 javaFx 中同一数据库中的两个 mysql 表填充 TableView ?

java - 将@Transactional 与@Commit 一起使用时无法测试预期异常