1

私はおそらくこれを間違った方法で回避していますが、私の質問は、どうすれば fxRates の配列を埋めることができるでしょうか?

CAD,EUR,GBP,USD
1.0,0.624514066,0.588714763,0.810307
1.601244959,1.0,0.942676548,1.2975
1.698615463,1.060809248,1.0,1.3764
1.234100162,0.772200772,.726532984,1.0

これは私がCSVファイルに持っている情報です。スキャナークラスを使用して読み取ることを考えていました。何かのようなもの

private double[][] fxRates;
String delimiter = ","
Scanner sc = new Scanner(file);
    while (sc.hasNextLine()) {
        String line = sc.nextLine();
        fxRates = line.split(delimiter)
4

5 に答える 5

1

この問題を解決するあなたの方法は大丈夫のようです。ただしline.split(",")、1D文字列配列を返します。に割り当てることはできませんfxRates。またfxRates、最初に初期化するには、行数または行数を知っておく必要があります。それ以外の場合は、のような動的リスト構造を使用する必要がありますArrayList

ファイルに50行あるとすると、次のように使用できます。

private String[][] fxRates = String[50][];
String delimiter = ",";
Scanner sc = new Scanner(file);     
int index=0;

while (sc.hasNextLine()) 
{
    String line = sc.nextLine();
    fxRates[index++] = line.split(delimiter)
}

また、2D文字列配列として宣言していることに注意してくださいfxRates。二重の値が必要な場合は、その場で、または後で変換を行う必要があります。

于 2012-10-19T05:22:17.217 に答える
0

このような方法で CSV を解析することはお勧めしませんScanner。それに比べて、DOM/SAX パーサーは、正規表現の解析など、ドキュメント構造を考慮しないものよりも、XML を解析する方が優れています。優れた API を備え、リーダーの初期化中に構成オプションを提案する CSV パーサーがあります。使いやすいCsvReaderをご覧ください。これを使用したコードサンプルは次のとおりです。

package q12967756;

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collection;

import static java.lang.Double.parseDouble;
import static java.lang.System.out;

import com.csvreader.CsvReader;

public final class Main {

    private Main() {
    }

    private static final String MOCK =
            "CAD,EUR,GBP,USD\n" +
            "1.0,0.624514066,0.588714763,0.810307\n" +
            "1.601244959,1.0,0.942676548,1.2975\n" +
            "1.698615463,1.060809248,1.0,1.3764\n" +
            "1.234100162,0.772200772,.726532984,1.0\n";

    private static final char SEPARATOR = ',';

    public static void main(String[] args) throws IOException {
        // final FileReader contentReader = new FileReader("yourfile.csv");
        final StringReader contentReader = new StringReader(MOCK);
        final CsvReader csv = new CsvReader(contentReader, SEPARATOR);
        csv.readHeaders(); // to skip `CAD,EUR,GBP,USD`
        final Collection<double[]> temp = new ArrayList<double[]>();
        while ( csv.readRecord() ) {
            temp.add(parseRawValues(csv.getValues()));
        }
        final double[][] array2d = temp.toArray(new double[temp.size()][]);
        out.println(array2d[3][1]);
    }

    private static double[] parseRawValues(String[] rawValues) {
        final int length = rawValues.length;
        final double[] values = new double[length];
        for ( int i = 0; i < length; i++ ) {
            values[i] = parseDouble(rawValues[i]);
        }
        return values;
    }

}
于 2012-10-19T07:35:28.667 に答える
0

split操作の結果はString配列であり、の配列ではありませんdouble。そのため、文字列を double に変換する 1 つのステップがありません。

private double[][] fxRates = new double[maxLines][4];
String delimiter = ","
int line = 0;
Scanner sc = new Scanner(file);
    while (sc.hasNextLine()) {
        String line = sc.nextLine();
        String[] fxRatesAsString = line.split(delimiter);
        for (int i = 0; i < fxRatesAsString.length; i++) {
            fxRates[line][i] = Double.parseDouble(fxRatesAsString[i]);
        }
于 2012-10-19T05:24:18.710 に答える
0

もう一つの例;

        Double[][] fxRates = new Double[4][];
        String delimiter = ",";
        //file code goes here
        Scanner sc = new Scanner(file);
        // Read File Line By Line
        int auxI = 0;
        // Read File Line By Line
        for (int auxI =0; sc.hasNextLine(); auxI++) {
            String line = sc.nextLine();
            System.out.println(line);
            String[] fxRatesAsString = line.split(delimiter);
            Double[] fxRatesAsDouble = new Double[fxRatesAsString.length];
            for (int i = 0; i < fxRatesAsString.length; i++) {
                fxRatesAsDouble[i] = Double.parseDouble(fxRatesAsString[i]);
                }
            fxRates[auxI] = fxRatesAsDouble;
        }
        //to double check it
        for (int y =0; y<fxRates.length; y++){              
            for (int x =0; x<fxRates.length; x++){
                System.out.print(fxRates[y][x] +" ");
            }
            System.out.println("");
        }
于 2012-10-19T05:57:35.633 に答える