【问题标题】:Appending column at the end of a csv file java在 csv 文件 java 的末尾附加列
【发布时间】:2021-09-07 05:40:42
【问题描述】:

我有一个 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();
    }
}

【问题讨论】:

  • CSV 文件意味着您应该使用 CSV 库来读取和写入文件。
  • 我试过但找不到解决办法。
  • 你展示了之后,但没有展示之前。我想我理解之前的状态,但如果你展示之前的状态、预期的之后状态和实际的之后状态,它会对你的问题有很大帮助。我正在对之前的状态做出假设,但我们知道“假设是所有错误的根源”。另外,我认为这与 eclipse 标签无关。
  • 这能回答你的问题吗? Java append new column to csv file
  • 我投了反对票,因为No research

标签: java arrays eclipse csv append


【解决方案1】:

标头需要与值分开处理。

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();
}

【讨论】:

  • values 变量的类型应该是什么?
  • 兄弟,它只是从上到下一直写标题。我将标题和值设为静态,因为它给了我错误。我该如何解决这个问题?
【解决方案2】:

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

Name,Age
Joe,15
Smith,20

我跑了(非常严格地改编自您的代码):

   static void tryStackOverflow () {
      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 应该在其他方法(您的主要方法)中并逐行添加。您的代码还假设该数组中的行数与元素数一样多。但不管这一点,我移动了数组并消除了appendingCol 方法并运行了这个:

   static void tryStackOverflow () {
      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

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多