使用filewriter将新文件写入csv文件

时间:2015-04-11 17:58:34

标签: java file csv stream filewriter

我正在处理一个包含45312个实例(行)和8个属性的CSV文件。我想修改(使用一些数学运算)输入csv文件并写入它。为了修改CSV,我从每个实例(行)中提取了每个列值(v ="逗号分隔位置"),然后尝试修改它。但我在这里遇到的问题是,当for循环移动到下一次迭代时(如v = 3,v = 3),则前一次迭代(v = 2)中的所有修改后的实例值都将恢复为原始状态。最后,我想要处理所有修改的新CSV文件。

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileWriter;
    import java.io.*; 
    public class Normalization {
     public static void main(String[] args)throws IOException {
            String filename = "abc.csv";
            File file = new File(filename);
            BufferedWriter writer = null;
    try{           
             writer = new BufferedWriter(new   FileWriter("lyupdated.csv"));      
        for (int v = 1; v < 8; v++)
        {
                Scanner inputStream = new Scanner(file);
          while (inputStream.hasNext())
          {
                String data = inputStream.next();         
                String[] values = data.split(",");
                double balance = Double.parseDouble(values[v]);
                balance=balance*10;//for mathoperation code simplification
                values[v] = String.valueOf(balance);      
                // iterate through the values and build a string out of them
                StringBuilder sb = new StringBuilder();
                //  String newData = sb.toString();
               for (int i = 0; i < values.length; i++) {
                        sb.append(values[i]);
                        if (i < values.length - 1) {
                            sb.append(",");
                        }
                    }
          System.out.println(sb.toString());
          writer.write(sb.toString()+"\n");
           }inputStream.close();           
        } writer.close();
     }
          catch (FileNotFoundException ex) {
                Logger.getLogger(Normalization.class.getName()).log(Level.SEVERE, null, ex);
            }
    }
    }

1 个答案:

答案 0 :(得分:0)

您的代码没有多大意义。您需要打开文件,有一个循环来逐行读取文件,并将每行拆分为8列。

但相反,看看你有什么:

for (int v = 1; v < 8; v++) {
    Scanner inputStream = new Scanner(file);

所以,

  • 你不会遍历文件的所有行,但超过7列
  • 在每次7次迭代中,您在文件上打开一个新的Scanner,因此始终从文件的开头读取

正如Tom在评论中所说,使用专用于CSV文件解析和生成的库。它具有以下优点:

  • 正确
  • 正在接受许多开发人员的测试,并进行了优化
  • 提供更高级别的API
  • 正确处理值的转义