2013-09-26 400 views
8

Tôi đang viết tệp csv bằng cách sử dụng trình soạn thảo được đệm trong java. Dữ liệu của tôi được viết chính xác nhưng tôi muốn có các cột khác nhau theo đó dữ liệu đến, Hiện tại nó đang viết từng trường hợp của ngày trong một hàng nhưng không được phân cách bằng các cột.viết tệp csv bằng cách sử dụng trình soạn thảo đệm trong Java

Mã này là

DateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); 
     File file = new File(dirName + "\\"+ df.format(new Date()) +"_Statistics.csv"); 
     if (!file.exists()) 
      file.createNewFile(); 

     FileWriter fw = new FileWriter(file); 
     writer = new BufferedWriter(fw); 
     writer.write("Message Source"); 
     writer.write("Message Name"); 
     writer.write("Component"); 
     writer.write("Occurance"); 
     writer.write("Message Payload"); 
     writer.write("Bandwidth (Payload)"); 
     writer.write("Message Payload with Header"); 
     writer.write("Bandwidth (Payload with Header)"); 
     writer.newLine(); 
     for (Signal signal : messages) { 
      writer.write(signal.getSource()); 
      writer.write(signal.getName()); 
      writer.write(signal.getComponent()); 
      writer.write(Integer.toString(signal.getOccurance())); 
      writer.write(Integer.toString(signal.getSize())); 
      writer.write(Float.toString(signal.getBandwidth())); 
      writer.write(Integer.toString(signal.getSizewithHeader())); 
      writer.write(Float.toString(signal.getBandwidthWithHeader())); 
      writer.newLine(); 
     } 
     writer.flush(); 
     writer.close(); 
     fw.close(); 

Có cách nào để tách các cột dữ liệu khôn ngoan để nó là đúng cách có thể đọc được?

EDIT

Thay vì sử dụng nhà văn đệm Tôi sử dụng CSVReader thư viện cho java. http://www.csvreader.com/java_csv.php Mã bây giờ là

DateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); 
     File file = new File(dirName + "\\"+ df.format(new Date()) +"_Statistics.csv"); 
     if (!file.exists()) 
      file.createNewFile(); 

     // Use FileWriter constructor that specifies open for appending 
     CsvWriter csvOutput = new CsvWriter(new FileWriter(file, true), ','); 

     //Create Header for CSV 
     csvOutput.write("Message Source"); 
     csvOutput.write("Message Name"); 
     csvOutput.write("Component"); 
     csvOutput.write("Occurance"); 
     csvOutput.write("Message Payload"); 
     csvOutput.write("Bandwidth (Payload)"); 
     csvOutput.write("Message Payload with Header"); 
     csvOutput.write("Bandwidth (Payload with Header)"); 
     csvOutput.endRecord(); 
     for (Signal signal : messages) { 
      csvOutput.write(signal.getSource()); 
      csvOutput.write(signal.getName()); 
      csvOutput.write(signal.getComponent()); 
      csvOutput.write(Integer.toString(signal.getOccurance())); 
      csvOutput.write(Integer.toString(signal.getSize())); 
      csvOutput.write(Float.toString(signal.getBandwidth())); 
      csvOutput.write(Integer.toString(signal.getSizewithHeader())); 
      csvOutput.write(Float.toString(signal.getBandwidthWithHeader())); 
      csvOutput.endRecord(); 
     } 
     csvOutput.flush(); 
     csvOutput.close(); 

Nó đúng định dạng dữ liệu nhưng vấn đề bây giờ là khi tôi chạy mã cho lần thứ 2 một tập tin thứ 2 được tạo ra và các file mới chứa hàng trùng lặp, cho mỗi hàng trong lần đầu tiên tệp có 2 hàng trong tệp thứ 2 có dữ liệu tương tự.

Đó có phải là tôi không làm sạch một số tài nguyên không?

Cảm ơn

+4

Cột phải được phân tách bằng dấu phẩy – tim

+0

@tim nghĩa là sau mỗi lần viết, tôi nên viết writer.write (","); – Wearybands

+2

Bạn có thể làm điều đó - có vẻ như chúng bị thiếu trong tên cột và trong dữ liệu. Để tài liệu định dạng chính xác, mỗi cột phải được phân tách bằng dấu phẩy. Đối với một .csv anyway – tim

Trả lời

-1

Từ những gì tôi hiểu dữ liệu thực tế của bạn không được xếp hàng với các cột, bởi vì không có cách nào cho nó biết làm thế nào rộng cột là.

Bạn có thể thử sử dụng tab hoặc xác định trước chiều rộng của mỗi cột (như tạo tất cả 10 ký tự).

+0

Có một cái gì đó như 'writer.write (" \ t ");' (ký tự tab) –

0

Nếu bạn muốn có một coloumn riêng biệt trong Excel, cho các lĩnh vực mà bạn đã viết trong mã của bạn nên thay vì fw.append(","); Chỉ cần cho fw.append(";"); Nó sẽ làm việc và để thiết lập Header, thay vì tạo một biến như String f="Id, Name, Salary" và chuyển biến đó sang phương thức fw.append(f); Chỉ cần chuyển trường thay vì tạo biến như fw.append("Id; Name; Salary") bằng dấu chấm phẩy.

1

Khi viết một tập tin csv bạn cần phải gửi kèm theo dữ liệu của bạn như thế này

csvOutput.write("\""); 
csvOutput.write(signal.getSource()); 
csvOutput.write("\""); 
csvOutput.write(",\"") 
csvOutput.write("\""); 
csvOutput.write(signal.getName() 
csvOutput.write("\""); 

Và bạn cần phải làm điều này vì nếu có một dấu phẩy trong một dữ liệu mà nó sẽ gây ra một vấn đề trong khi phân tích và làm cho dữ liệu được đặt trong một cột khác nhau. Ngoài ra, hãy đảm bảo rằng bên trong cuối cùng chặn

finally { 
//csvOutput is closed here 

}