HOWTO · Java

用 Java 將字串寫入 CSV 檔案

本文介紹瞭如何使用兩種方法在 Java 中將字串寫入 CSV。

本頁內容

CSV 代表 Comma Separated Values;它是系統之間大量資料傳輸的常用格式。還有許多與 Java 一起使用的解析器庫能夠處理這種格式。

在 Java 中使用 PrintWriter 讀取和寫入 CSV 檔案

Java 中的 PrinterWriter 函式是一個編寫器類,用於將物件的格式化表示列印到文字輸出流。我們建立了一個 writer 物件,傳遞一個名為 test.csv 的新檔案作為 writer 的目的地。在這裡,sb 物件將指定的字串附加到字元序列。

writer 例項上的 write() 方法將文字內容寫入流中。flush() 方法將內容重新整理到檔案中,close() 方法永久關閉流。我們還可以讀取 test.csv 檔案的內容。

在 TestCSV 類例項上呼叫 readCSVFile() 方法。在這裡,我們使用指定檔案中的值建立了 Scanner 類的例項。它使用分隔符模式將資料分解為標記。如果 Scanner 有另一行輸入,則 hasNextLine() 返回 true。因此,我們使用 next() 方法讀取每一行標記資料並將其儲存在一個陣列中,最後列印輸出。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class TestCSV {
  public static void main(String args[]) {
    try (PrintWriter writer = new PrintWriter(new File("test.csv"))) {
      StringBuilder sb = new StringBuilder();
      sb.append("id");
      sb.append(',');
      sb.append("Name");
      sb.append(',');
      sb.append("Address");
      sb.append('\n');

      sb.append("101");
      sb.append(',');
      sb.append("John Doe");
      sb.append(',');
      sb.append("Las Vegas");
      sb.append('\n');

      writer.write(sb.toString());
      writer.close();
      System.out.println("done!");

    } catch (FileNotFoundException e) {
      System.out.println(e.getMessage());
    }
    TestCSV testCSV = new TestCSV();
    testCSV.readCSVFile();
  }

  public void readCSVFile() {
    List<List<String>> records = new ArrayList<>();
    try (Scanner scanner = new Scanner(new File("test.csv"));) {
      while (scanner.hasNextLine()) {
        records.add(getRecordFromLine(scanner.nextLine()));
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    System.out.println(records.toString());
  }
  private List<String> getRecordFromLine(String line) {
    List<String> values = new ArrayList<String>();
    try (Scanner rowScanner = new Scanner(line)) {
      rowScanner.useDelimiter(",");
      while (rowScanner.hasNext()) {
        values.add(rowScanner.next());
      }
    }
    return values;
  }
}

輸出:

done!
[[id, Name, Address], [101, John Doe, Las Vegas]]

在 Java 中使用 OpenCSV 庫讀取和寫入 CSV 檔案

這個庫的 maven 依賴如下:

 <dependency>
      <groupId>com.opencsv</groupId>
      <artifactId>opencsv</artifactId>
      <version>5.4</version>
 </dependency>

OpenCsv 是一個簡單的 java 解析器庫;它有一組 OpenCsv 類,我們用來讀取和寫入 CSV 檔案。在 main() 方法中,我們首先使用 CSVWriter 類呼叫該方法以寫入 CSV 檔案。此類用於將 CSV 資料寫入編寫器實現。

我們建立一個 CSVWriter 的 writer 例項,並在該物件上呼叫 writeNext() 函式以生成一個 CSV 檔案,其中包含使用分隔符分隔的字串陣列中的資料。close() 方法關閉編寫器流。

為了從我們以 CSV 格式建立的檔案中讀取資料,我們在主類物件上呼叫 readCSVFile 方法,在那裡我們解析 CSV 檔案。為了一次將所有記錄讀入列表,我們使用 readAll() 方法。我們遍歷每條記錄並將其列印出來。

import com.opencsv.CSVReader;
import com.opencsv.CSVWriter;
import com.opencsv.exceptions.CsvException;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class CSVLibrary {
  public static void main(String args[]) {
    CSVLibrary csvLibrary = new CSVLibrary();
    csvLibrary.writeToCsv();
    csvLibrary.readCSVFile();
  }
  public void writeToCsv() {
    String csv = "data.csv";
    try {
      CSVWriter writer = new CSVWriter(new FileWriter(csv));
      String[] record = "2,Virat,Kohli,India,30".split(",");
      writer.writeNext(record);

      writer.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  public void readCSVFile() {
    CSVReader reader = null;
    try {
      reader = new CSVReader(new FileReader("data.csv"));
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }

    List<String[]> allRows = null;
    try {
      allRows = reader.readAll();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (CsvException e) {
      e.printStackTrace();
    }

    for (String[] row : allRows) {
      System.out.println(Arrays.toString(row));
    }
  }
}

輸出:

[2, Virat, Kohli, India, 30]