25

複数列の csv ファイルから特定の列を読み取り、それらの列を Java を使用して他の csv ファイルに出力したいと考えています。何か助けてください。以下は、各トークンを 1 行ずつ印刷するコードです。しかし、複数列の csv から数列だけを印刷しようとしています。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.StringTokenizer;

public class ParseCSV {

    public static void main(String[] args) {

        try
        {

            //csv file containing data
            String strFile = "C:\\Users\\rsaluja\\CMS_Evaluation\\Drupal_12_08_27.csv";

            //create BufferedReader to read csv file
            BufferedReader br = new BufferedReader( new FileReader(strFile));
            String strLine = "";
            StringTokenizer st = null;
            int lineNumber = 0, tokenNumber = 0;

            //read comma separated file line by line
            while( (strLine = br.readLine()) != null)
            {
                lineNumber++;

                //break comma separated line using ","
                st = new StringTokenizer(strLine, ",");

                while(st.hasMoreTokens())
                {
                //display csv values
                tokenNumber++;
                System.out.println("Line # " + lineNumber +
                                ", Token # " + tokenNumber
                                + ", Token : "+ st.nextToken());


                            System.out.println(cols[4]);
4

8 に答える 8

53

CSV ファイルの読み取りと書き込みには、優れたOpenCSVを使用する必要があります。ライブラリを使用するように例を適応させるには、次のようになります。

public class ParseCSV {
  public static void main(String[] args) {
    try {
      //csv file containing data
      String strFile = "C:/Users/rsaluja/CMS_Evaluation/Drupal_12_08_27.csv";
      CSVReader reader = new CSVReader(new FileReader(strFile));
      String [] nextLine;
      int lineNumber = 0;
      while ((nextLine = reader.readNext()) != null) {
        lineNumber++;
        System.out.println("Line # " + lineNumber);

        // nextLine[] is an array of values from the line
        System.out.println(nextLine[4] + "etc...");
      }
    }
  }
}
于 2012-08-28T23:49:36.400 に答える
11

CSV ファイルの読み取りは、Java では非常に単純で一般的です。実際には、これを行うために追加のサードパーティ ライブラリを読み込む必要はありません。CSV (カンマ区切り値) ファイルは、通常のプレーン テキスト ファイルであり、列ごとにデータを格納し、セパレータ (カンマ "," など) で分割します。

CSV ファイルから特定の列を読み取るには、いくつかの方法があります。最も簡単なのは以下のとおりです。

サードパーティ ライブラリなしで CSV を読み取るコード

BufferedReader br = new BufferedReader(new FileReader(csvFile));
while ((line = br.readLine()) != null) {
    // use comma as separator
    String[] cols = line.split(cvsSplitBy);
    System.out.println("Coulmn 4= " + cols[4] + " , Column 5=" + cols[5]);
}

気がつけば、ここでは特別なことは何も行われていません。テキストファイルを読み込んで、区切り文字「,」で吐き出すだけです。

GeoLite Free Downloadable Databasesで従来の国の CSV データからの抽出を検討してください

"1.0.0.0","1.0.0.255","16777216","16777471","AU","Australia"
"1.0.1.0","1.0.3.255","16777472","16778239","CN","China"
"1.0.4.0","1.0.7.255","16778240","16779263","AU","Australia"
"1.0.8.0","1.0.15.255","16779264","16781311","CN","China"
"1.0.16.0","1.0.31.255","16781312","16785407","JP","Japan"
"1.0.32.0","1.0.63.255","16785408","16793599","CN","China"
"1.0.64.0","1.0.127.255","16793600","16809983","JP","Japan"
"1.0.128.0","1.0.255.255","16809984","16842751","TH","Thailand"

上記のコードは次のように出力されます。

Column 4= "AU" , Column 5="Australia"
Column 4= "CN" , Column 5="China"
Column 4= "AU" , Column 5="Australia"
Column 4= "CN" , Column 5="China"
Column 4= "JP" , Column 5="Japan"
Column 4= "CN" , Column 5="China"
Column 4= "JP" , Column 5="Japan"
Column 4= "TH" , Column 5="Thailand"

実際、putの列をMap使用して、 を使用するだけで値を取得できますkey

シシール

于 2014-03-20T08:46:36.250 に答える
6

申し訳ありませんが、これらの回答のいずれも最適な解決策を提供していません。OpenCSV などのライブラリを使用する場合、特定の列から情報を抽出する特殊なケースを処理するために、多くのコードを記述する必要があります。

たとえば、目的よりも列が少ない行がある場合は、それを処理するために多くのコードを記述する必要があります。OpenCSV の例を使用します。

  CSVReader reader = new CSVReader(new FileReader(strFile));
  String [] nextLine;
  while ((nextLine = reader.readNext()) != null) {
       //let's say you are interested in getting columns 20, 30, and 40
       String[] outputRow = new String[3];
       if(parsedRow.length < 40){
            outputRow[2] = null;
       } else {
            outputRow[2] = parsedRow[40]
       }
       if(parsedRow.length < 30){
            outputRow[1] = null;
       } else {
            outputRow[1] = parsedRow[30]
       }
       if(parsedRow.length < 20){
            outputRow[0] = null;
       } else {
            outputRow[0] = parsedRow[20]
       }

  }

これは、単純な要件に対する大量のコードです。名前で列の値を取得しようとすると、さらに悪化します。uniVocity-parsersによって提供されるパーサーなど、より最新のパーサーを使用する必要があります。

必要な列を確実かつ簡単に取得するには、次のように記述します。

CsvParserSettings settings = new CsvParserSettings();
parserSettings.selectIndexes(20, 30, 40);
CsvParser parser = new CsvParser(settings);
List<String[]> allRows = parser.parseAll(new FileReader(yourFile));

開示:私はこのライブラリの作成者です。オープンソースで無料です (Apache V2.0 ライセンス)。

于 2014-11-15T15:18:14.037 に答える
1

Apache Commons CSV https://commons.apache.org/proper/commons-csv/を使用することをお勧めします

以下に一例を示します。

    Path currentRelativePath = Paths.get("");
    String currentPath = currentRelativePath.toAbsolutePath().toString();
    String csvFile = currentPath + "/pathInYourProject/test.csv";

    Reader in;
    Iterable<CSVRecord> records = null;
    try
    {
        in = new FileReader(csvFile);
        records = CSVFormat.EXCEL.withHeader().parse(in); // header will be ignored
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

    for (CSVRecord record : records) {
        String line = "";
        for ( int i=0; i < record.size(); i++)
        {
            if ( line == "" )
                line = line.concat(record.get(i));
            else
                line = line.concat("," + record.get(i));
        }
        System.out.println("read line: " + line);
    }

"は自動的に認識しますが、 ;は認識しません(設定できるかもしれません...)。

私のサンプルファイルは次のとおりです。

col1,col2,col3
val1,"val2",val3
"val4",val5
val6;val7;"val8"

出力は次のとおりです。

read line: val1,val2,val3
read line: val4,val5
read line: val6;val7;"val8"

最後の行は 1 つの値のように見なされます。

于 2015-11-04T14:57:35.403 に答える
0

コア Java だけを使用して、CVS ファイルを列ごとに読み取ることができます。これが私の要件のために書いたサンプルコードです。私はそれが誰かのために役立つと信じています。

 BufferedReader br = new BufferedReader(new FileReader(csvFile));
    String line = EMPTY;
    int lineNumber = 0;

    int productURIIndex = -1;
    int marketURIIndex = -1;
    int ingredientURIIndex = -1;
    int companyURIIndex = -1;

    // read comma separated file line by line
    while ((line = br.readLine()) != null) {
        lineNumber++;
        // use comma as line separator
        String[] splitStr = line.split(COMMA);
        int splittedStringLen = splitStr.length;

        // get the product title and uri column index by reading csv header
        // line
        if (lineNumber == 1) {
            for (int i = 0; i < splittedStringLen; i++) {
                if (splitStr[i].equals(PRODUCTURI_TITLE)) {
                    productURIIndex = i;
                    System.out.println("product_uri index:" + productURIIndex);
                }

                if (splitStr[i].equals(MARKETURI_TITLE)) {
                    marketURIIndex = i;
                    System.out.println("marketURIIndex:" + marketURIIndex);
                }

                if (splitStr[i].equals(COMPANYURI_TITLE)) {
                    companyURIIndex = i;
                    System.out.println("companyURIIndex:" + companyURIIndex);
                }

                if (splitStr[i].equals(INGREDIENTURI_TITLE)) {
                    ingredientURIIndex = i;
                    System.out.println("ingredientURIIndex:" + ingredientURIIndex);
                }
            }
        } else {
            if (splitStr != null) {
                String conditionString = EMPTY;
                // avoiding arrayindexoutboundexception when the line
                // contains only ,,,,,,,,,,,,,
                for (String s : splitStr) {
                    conditionString = s;
                }
                if (!conditionString.equals(EMPTY)) {
                    if (productURIIndex != -1) {
                        productCVSUriList.add(splitStr[productURIIndex]);
                    }
                    if (companyURIIndex != -1) {
                        companyCVSUriList.add(splitStr[companyURIIndex]);
                    }
                    if (marketURIIndex != -1) {
                        marketCVSUriList.add(splitStr[marketURIIndex]);
                    }
                    if (ingredientURIIndex != -1) {
                        ingredientCVSUriList.add(splitStr[ingredientURIIndex]);
                    }
                }
            }
        }
于 2013-01-18T10:21:07.113 に答える
-1

では、これはどうでしょうか!!

このコードは、csv ファイルの行数と列数の両方を計算します。これを試してみてください!!

    static int[] getRowsColsNo() {
    Scanner scanIn = null;
    int rows = 0;
    int cols = 0;
    String InputLine = "";
    try {
        scanIn = new Scanner(new BufferedReader(
                new FileReader("filename.csv")));
        scanIn.useDelimiter(",");
        while (scanIn.hasNextLine()) {
            InputLine = scanIn.nextLine();
            String[] InArray = InputLine.split(",");
            rows++;
            cols = InArray.length;
        }

    } catch (Exception e) {
        System.out.println(e);
    }
    return new int[] { rows, cols };
}
于 2015-04-30T09:32:53.760 に答える