在 csv 文件末尾追加列 java

Appending column at the end of a csv file java

我有一个 csv 文件,里面有一些数据,我想在里面追加一列。例如:

Name,Age,Marks
Joe,15,1
Smith,20,2

我想通过代码附加该标记列。我遇到的问题是

Name,Age,Marks
Joe,15
1
2
Smith,20
1
2

数据被写入 2 次,并且在第一列(除了第一列)。我怎样才能阻止它这样做?过去 1 周我一直陷入这个问题
我的代码:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class appendCol {
    public static String appendingCol() {
        String stringArray[] = {"Marks", "1", "2"};
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < stringArray.length; i++) {
            sb.append(stringArray[i]);
        }
        String str = sb.toString();
        return str;
    }

    public static void main(String[] args) throws IOException {
        String line = "";
        BufferedWriter writer = new BufferedWriter(new FileWriter("D:\temp.csv"));
        try (BufferedReader br = new BufferedReader(new FileReader("D:\text1.csv"))) {
            while ((line = br.readLine()) != null) {
                String newFileLine = line + "," + appendingCol();
                writer.write(newFileLine);
                writer.newLine();
            }
        }
        writer.close();
    }
}

header 需要与值分开处理。

public static void main(String[] args) throws IOException {

Map<String, String[]> csvCol = new HashMap<String, String[]>();
String stringArray[] = { "1", "2" };
csvCol.put('Marks', stringArray);


String line = "";
BufferedWriter writer = new BufferedWriter(new FileWriter("D:\temp.csv"));
try (BufferedReader br = new BufferedReader(new FileReader("D:\text1.csv"))) {


    String headers = "";
    String values = "";
    String newFileLine ="";
    bool isHeader=true;
    while ((line = br.readLine()) != null) {
        if(isHeader){
           csvCol.forEach((k,v) -> {
              headers = "," + k ;
           });
              newFileLine = line + headers ;
         }else{
           csvCol.forEach((k,v) -> {
              values = "," + v ;
           });
           newFileLine = line + values;
           isHeader = false;
         }
        writer.write(newFileLine);
        writer.newLine(); 
    }
}
writer.close();
}

将此作为 text1.csv 中的输入:

Name,Age
Joe,15
Smith,20

I 运行(非常紧密地改编自您的代码):

   static void tryWhosebug () {
      String line = "";
      try {
         BufferedWriter writer = new BufferedWriter (new FileWriter ("temp.csv"));
         BufferedReader br = new BufferedReader (new FileReader ("text1.csv"));
         while ((line = br.readLine ()) != null) {
            String newFileLine = line + "," + appendingCol ();
            writer.write (newFileLine);
            writer.newLine ();
         }
         writer.close ();
      } catch (IOException excep) {
         System.err.println ("Exception " + excep);
      }
   }


   public static String appendingCol () {
      String stringArray[] = { "Marks", "1", "2" };
      StringBuilder sb = new StringBuilder ();
      for (int i = 0; i < stringArray.length; i++) {
         sb.append (stringArray [i]);
      }
      String str = sb.toString ();
      return str;
   }

产生了:

Name,Age,Marks12
Joe,15,Marks12
Smith,20,Marks12

那么似乎很清楚stringArray应该在另一个方法(你的main方法)中并逐行添加。您的代码还假定行数与该数组中的元素一样多。但是不管那个,我移动了数组并删除了 appendingCol 方法和 运行 这个:

   static void tryWhosebug () {
      String line = "";
      String stringArray[] = { "Marks", "1", "2" };
      int lineNum = 0;
      try {
         BufferedWriter writer = new BufferedWriter (new FileWriter ("temp.csv"));
         BufferedReader br = new BufferedReader (new FileReader ("text1.csv"));
         while ((line = br.readLine ()) != null) {
            String newFileLine = line + "," + stringArray [lineNum++];
            writer.write (newFileLine);
            writer.newLine ();
         }
         writer.close ();
      } catch (IOException excep) {
         System.err.println ("Exception " + excep);
      }
   }

产生了这个:

Name,Age,Marks
Joe,15,1
Smith,20,2

此问题需要在原始 CSV 中再追加一列。 Java 实现的代码更长。不过用Java下的open-source包SPL写起来很容易,只要一句话:

+ A
1 =file("temp.csv").export@wc(file("test1.csv").import@wc().(~|="Marks,1,2".split@c()(#)))

SPL提供JDBC供JAVA调用,将上述脚本保存为append.splx,将脚本文件作为存储过程调用在JAVA中:

…

Class.forName("com.esproc.jdbc.InternalDriver");

con= DriverManager.getConnection("jdbc:esproc:local://");

st=con.prepareCall("call append()");

st.execute();

…

或者在JAVA中直接执行SQL中的SPL字符串:

…    
st = con.prepareStatement("==file(\"temp.csv\").export@wc(file(\"test1.csv\")
.import@wc().(~|=\"Marks,1,2\".split@c()(#)))");

st.execute();    
…