簡體   English   中英

讀取Java中的CSV文件並將值存儲在int數組中

[英]Reading CSV file in Java and storing the values in an int array

我有以下格式的字符串CSV文件:

14/10/2011  422     391.6592    394.52324   0.039215686
13/10/2011  408.43  391.7612    395.0686031 0.039215686
12/10/2011  402.19  391.834     395.3478736 0.039215686

我要做的只是讀取csv文件,然后將第3和第4列數據存儲在整數數組中。

這是我編寫的代碼:

    BufferedReader CSVFile = 
            new BufferedReader(new FileReader("appleData.csv"));

    String dataRow = CSVFile.readLine(); 
    int count = 0;

    while (dataRow != null){
        String[] dataArray = dataRow.split(",");

        EMA[count] = dataArray[2];
        SMA[count] = dataArray[3];

        dataRow = CSVFile.readLine(); // Read next line of data.
    }
    // Close the file once all data has been read.
    CSVFile.close();

我想以兩個數組結束,EMA包含來自第三列的所有值,而SMA包含來自第四列的所有值。

我收到一個空指針異常。 有人可以告訴我我犯了什么錯誤嗎?

您的文件似乎使用空格/制表符作為分隔符,但您正在使用逗號分隔。 這對我來說毫無意義。

您假定數據行具有一定的長度而不檢查它。 這對我來說毫無意義。

這段代碼將向您展示如何做得更好:

package cruft;

import org.apache.commons.lang3.StringUtils;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * CsvParser
 * @author Michael
 * @link http://stackoverflow.com/questions/14114358/reading-csv-file-in-java-and-storing-the-values-in-an-int-array/14114365#14114365
 * @since 1/1/13 4:26 PM
 */
public class CsvParser {
    public static void main(String[] args) {
        try {
            FileReader fr = new FileReader((args.length > 0) ? args[0] : "resources/test.csv");
            Map<String, List<String>> values = parseCsv(fr, "\\s+", true);
            System.out.println(values);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Map<String, List<String>> parseCsv(Reader reader, String separator, boolean hasHeader) throws IOException {
        Map<String, List<String>> values = new LinkedHashMap<String, List<String>>();
        List<String> columnNames = new LinkedList<String>();
        BufferedReader br = null;
        br = new BufferedReader(reader);
        String line;
        int numLines = 0;
        while ((line = br.readLine()) != null) {
            if (StringUtils.isNotBlank(line)) {
                if (!line.startsWith("#")) {
                    String[] tokens = line.split(separator);
                    if (tokens != null) {
                        for (int i = 0; i < tokens.length; ++i) {
                            if (numLines == 0) {
                                columnNames.add(hasHeader ? tokens[i] : ("row_"+i));
                            } else {
                                List<String> column = values.get(columnNames.get(i));
                                if (column == null) {
                                    column = new LinkedList<String>();
                                }
                                column.add(tokens[i]);
                                values.put(columnNames.get(i), column);
                            }
                        }
                    }
                    ++numLines;
                }
            }
        }
        return values;
    }
}

這是我用來測試的輸入文件:

# This shows that comments, headers and blank lines work fine, too.
date        value1  value2      value3      value4
14/10/2011  422     391.6592    394.52324   0.039215686

13/10/2011  408.43  391.7612    395.0686031 0.039215686



12/10/2011  402.19  391.834     395.3478736 0.039215686

這是我得到的輸出:

{date=[14/10/2011, 13/10/2011, 12/10/2011], value1=[422, 408.43, 402.19], value2=[391.6592, 391.7612, 391.834], value3=[394.52324, 395.0686031, 395.3478736], value4=[0.039215686, 0.039215686, 0.039215686]}

Process finished with exit code 0

[1] while循環內應該有一個count ++

[2]您尚未定義/初始化EMA和SMA數組-導致異常。

[3]如果用逗號split()並有一個空格分隔的文件,則結果將是一個單位長度的數組,並且索引2和3帶有generate NullPointerException-即使您正確初始化了數組。

我建議通過將它們添加到循環中的列表(如ArrayList或Vector)中來讀取數字,因為您事先不知道大小。 一旦退出循環,請創建2個適當大小的數組,然后將它們復制到數組中的數據。 讓垃圾收集器處理向量。

您的代碼的問題是int [] EMA不是初始化。 它只是將EMA定義為整數數組,而沒有有效地創建它(您只有引用)。

我的建議是將EMA和SMA更改為ArrayLists ,而不是使用歸因,您可以將當前元素添加到列表中。

在循環的最后,您可以使用size()方法獲取每個ArrayList上的元素數量,並可以使用toArray方法將它們更改為數組,從而實現您可能達到的任何目標。

當然,我假設您在示例中忘記了逗號。 否則,應將定界符更改為空格。

暫無
暫無

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

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