簡體   English   中英

Java:CSV 文件易讀/寫

[英]Java: CSV File Easy Read/Write

我正在開發一個需要快速訪問 CSV 逗號分隔電子表格文件的程序。 到目前為止,我已經能夠使用 BufferedReader 輕松讀取它。 但是,現在我希望能夠編輯它讀取的數據,然后將其導出回 CSV。

電子表格包含姓名、電話號碼、email 地址等。程序列出了每個人的數據,當你點擊它們時,它會彈出一個頁面,其中包含更詳細的信息,也是從 CSV 中提取的。在該頁面上,你可以編輯數據,我希望能夠單擊“保存更改”按鈕,然后將數據導出回 CSV 中相應的行——或者刪除舊的,append 新的。

我不太熟悉使用 BufferedWriter,或者我應該使用的任何東西。

我開始做的是創建一個名為 FileIO 的自定義 class。 它包含一個 BufferedReader 和一個 BufferedWriter。 到目前為止,它有一個返回 bufferedReader.readLine() 的方法,稱為 read()。 現在我想要一個名為 write(String line) 的 function。

public static class FileIO {
    BufferedReader read;
    BufferedWriter write;

    public FileIO (String file) throws MalformedURLException, IOException {
        read = new BufferedReader(new InputStreamReader (getUrl(file).openStream()));
        write = new BufferedWriter (new FileWriter (file));
    }

    public static URL getUrl (String file) throws IOException {
        return //new URL (fileServer + file).openStream()));
                FileIO.class.getResource(file);
    }

    public String read () throws IOException {
        return read.readLine();
    }

    public void write (String line) {
        String [] data = line.split("\\|");
        String firstName = data[0];

        // int lineNum = findLineThatStartsWith(firstName);
        // write.writeLine(lineNum, line);
    }
};

我希望有人知道我該怎么做?

您可以查看支持讀取和寫入 CSV 文件的OpenCSV ,而不是重新發明輪子。 以下是閱讀和寫作的例子

請考慮Apache commons csv 為了快速理解api,有四個重要的類:

CSV格式

指定 CSV 文件的格式並解析輸入。

CSV解析器

根據指定的格式解析 CSV 文件。

CSV打印機

以 CSV 格式打印值。

CSV記錄

從 CSV 文件解析的 CSV 記錄。

代碼示例: 在此處輸入圖片說明

單元測試代碼: 在此處輸入圖片說明

電子表格包含姓名、電話號碼、電子郵件地址等。該程序列出了每個人的數據,當您單擊它們時,它會顯示一個包含更詳細信息的頁面,這些信息也是從 CSV 中提取的。 在該頁面上,您可以編輯數據,我希望能夠單擊“保存更改”按鈕,然后將數據導出回 CSV 中的相應行——或者刪除舊的,並附加新的。

文件的內容是一個字節序列。 CSV 是一種基於文本的文件格式,即將字節序列解釋為字符序列,其中換行符由特殊的換行符分隔。

因此,如果一行的長度增加,則需要移動所有后續行的字符以為新字符騰出空間。 同樣,要刪除一行,您必須移動后面的字符以填補空白。 也就是說,如果不重寫文件中的所有后續行,就不能更新 csv 中的一行(至少在更改其長度時不能)。 為簡單起見,我會重寫整個文件。

由於您已經擁有編寫和讀取 CSV 文件的代碼,因此修改它應該很簡單。 但在此之前,不妨問問自己是否使用了適合這項工作的工具。 如果目標是保留記錄列表,並在表單中編輯單個記錄,則 Microsoft Access 或 Open Office 等價物之類的程序可能更適合。 如果您的 UI 需要超出這些程序提供的范圍,那么使用關系數據庫來保存您的數據可能更合適(比 CSV 更有效和靈活)。

添加依賴項

implementation 'com.opencsv:opencsv:4.6'

在 onCreate() 中添加以下代碼

InputStreamReader is = null;
        try {
              String path= "storage/emulated/0/Android/media/in.bioenabletech.imageProcessing/MLkit/countries_image_crop.csv";
            
             CSVReader reader = new CSVReader(new FileReader(path));
             String[] nextLine;
             int lineNumber = 0;
             while ((nextLine = reader.readNext()) != null) {
                lineNumber++;

                //print CSV file according to your column 1 means first column, 2 means 
                  second column
                Log.e(TAG, "onCreate: "+nextLine[2] );
            }
        }
        catch (Exception e)
        {
             Log.e(TAG, "onCreate: "+e );
        }

我解決了它使用

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-csv</artifactId>
        <version>2.8.6</version>
    </dependency>

  private static final CsvMapper mapper = new CsvMapper();
  public static <T> List<T> readCsvFile(MultipartFile file, Class<T> clazz) throws IOException {
    InputStream inputStream = file.getInputStream();
    CsvSchema schema = mapper.schemaFor(clazz).withHeader().withColumnReordering(true);
    ObjectReader reader = mapper.readerFor(clazz).with(schema);
    return reader.<T>readValues(inputStream).readAll();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM