2016-12-28 19 views
0

私はJavaプログラミングが初めてで、CSVファイルを解析し、CSVファイルの正しい行を印刷するように指示されています。印刷された行には一意の第1列と第2列が必要であり、第3列には「いいえ」が含まれていなければならず、第4列には 以上の値があることが必要です。12.Java:CSVファイルの列を比較して特定の行を印刷する方法

合計5列あります。

また、CSVを解析するライブラリは使用できません。

private static String[] routerData; 

public static void main(String [] args) { 

    // Input of file which needs to be parsed 
    String csvFile = "./sample.csv"; 
    BufferedReader csvReader = null; 

    // Data split by ',' in CSV file 
    String line = null; 
    String csvSplitBy = ","; 

    try { 

     // Create the CSV file reader 
     csvReader = new BufferedReader(new FileReader(csvFile)); 
     while ((line = csvReader.readLine()) !=null) { 

      routerData = line.split(csvSplitBy, -1); 
      System.out.println(routerData[0] + ", " + routerData[1] + ", " + routerData[2] + ", " + routerData[3] + ", " + routerData[4]); 

     } 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (csvReader != null) { 
      try { 
       csvReader.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

}

編集サンプルCSV:

例えば、サンプルCSVファイルは次のようになります。

Name,IP,Working?,Version,Comments 
name,0.0.0.0,No,11.2,Some GUI Bugs 
name2,0.1.2.0,Yes,12.3, 
name,0.0.1.0,Yes,12.2,Case broken, 
name4,0.0.0.0,no,10.3 
ここ

は、これまでの私のコードです

コードではCSVファイルを取得してから印刷する必要があります一意の名前(1列目)、一意のIP(2列目)、「いいえ」(作業中)という行が表示されます。 (3列目)と12以上のバージョン値。

どのようなデータ構造を使用すれば列を比較できるか分かりません。

私は何かアドバイスありがとうございます!

+0

第1列と第2列は、相互に、またはCSVデータファイル全体の第1列と第2列に対して一意である必要がありますか? – DevilsHnd

+0

@DevilsHnd完全なCSVファイルのためにユニークです。だから私はすべての要件に一致する場合にのみ、CSVファイルから正しい行を出力する必要があります。 –

+0

その場合、@ Adil Khan、あなたの質問に対する私の答えをチェックしてください。 – DevilsHnd

答えて

0

「あなたの質問内の要件はかなり混乱していると、物事はドンサンプルのCSVデータがない場合は簡単に取得できます。混乱する部分は、一意性に関する列1および列2のデータに関連している。 ユニークとは何と考えていますか?

A))は、そのそれぞれの列内(列1およびまたは列2は、他のCSVファイルの行に重複しない文字列や数値が含まれているという意味で重複一意でないですか?

B)それとも列1及び又は第2列は、それ自体の上に一意の文字列または数値を含み、他のCSVファイルの行に見出すことができるという点でユニークであることである(その内せ重複それぞれの列)?

以下のコード例は、一意の条件(A)を前提としています。これは、その後、意味CSVファイルには、次のカンマ区切りの行が含まれる場合、その後の2つだけ、それらの行のは、指定されたデータの条件を満たします:

Jack,Flash,yes,14,Unknown Value 
Bob,Stick,no,11,Unknown Value 
Jack,Flash,no,22,Unknown Value 
Fred,Frog,yes,6,Unknown Value 
Bob,Stick,no,32,Unknown Value 
Tracey,Jones,no,17,Unknown Value 
Fred,Frog,no,23,Unknown Value 
John,Brown,no,12,Unknown Value 
Bob,Stick,yes,88,Unknown Value 

のみの2行はにユニークである列1と2を持っているので、 CSVファイル全体彼らはどのラインですか?ここで

はサンプルコードです:

ArrayList<String> resultList = new ArrayList<>(); 
ArrayList<String> linesList = new ArrayList<>(); 
// Input of file which needs to be parsed 
String csvFile = "sample.csv"; 
BufferedReader csvReader; 

// Data split by ',' in CSV file 
String csvSplitBy = ","; 
try { 
    // Read the CSV file into an ArrayList array for easy processing. 
    String line; 
    csvReader = new BufferedReader(new FileReader(csvFile)); 
    while ((line = csvReader.readLine()) !=null) { 
     linesList.add(line); 
    } 
    csvReader.close(); 
} 
catch (IOException e) { e.printStackTrace(); } 

// Process each CSV file line which is now contained within 
// the linesList list Array 
for (int i = 0; i < linesList.size(); i++) { 
    String[] data = linesList.get(i).split(csvSplitBy); 
    String col1 = data[0]; 
    String col2 = data[1]; 
    String col3YesNo = data[2]; 
    //int col4Value = Integer.parseInt(data[3]); //WAS THIS 
    double col4Value = Double.parseDouble(data[3]); // *** SHOULD BE *** 
    String col5Unknown = data[4]; 

    // Determine if Column 1 and Column 2 data for the 
    // current line is unique to the entire CSV file. 
    boolean columns1And2AreUnique = true; 
    for (int j = 0; j < linesList.size(); j++) { 
     String[] tmp = linesList.get(j).split(csvSplitBy); 
     // Make sure we don't process the same line we are on... 
     if (j != i) { 
      if (col1.equals(tmp[0]) || col2.equals(tmp[1])) { 
       columns1And2AreUnique = false; 
       break; 
      } 
     } 
    } 
    if (columns1And2AreUnique && col3YesNo.equalsIgnoreCase("no") && col4Value >= 12.0) { 
     resultList.add(linesList.get(i)); 
    } 
} 

// Display the determined results from the CSV file. 
if (resultList.isEmpty()) { 
    System.out.println("There could be no data results gathered from the supplied\n" 
        + "CSV file which meets the required criteria."); 
} 
else { 
    System.out.println("Column 1\tColumn 2\tColumn 3\tColumn 4\tColumn 5"); 
    System.out.println("================================================" 
        + "========================\n"); 
    String padString = "  "; //Used for simple space padding in display 
    for (int i = 0; i < resultList.size(); i++) { 
     String[] tmp = resultList.get(i).split(csvSplitBy); 
     System.out.println(tmp[0] + padString.substring(tmp[0].length()) + "\t" 
         + tmp[1] + padString.substring(tmp[1].length()) + "\t" 
         + tmp[2] + padString.substring(tmp[2].length()) + "\t" 
         + tmp[3] + padString.substring(tmp[3].length()) + "\t" 
         + tmp[4]); 
    } 
} 

EDIT:今、あなたのCSVファイルからいくつかのサンプルデータを掲載していることを...

まあ、私は私の柱状CSVと非常に近かったですデータ型の前提はありますが、第4番目のデータ列にはDoubleのデータ型の値が含まれていることがわかったので、コードを変更する必要があります。

あなたが述べているコード行を変更する必要があります:あなたがいる一方でこれはあなたに少しを助けるべき

double col4Value = Double.parseDouble(data[3]); 

:ダブルデータ型の値を扱うこのコード行に

int col4Value = Integer.parseInt(data[3]); 

を必要に応じてコードを変更してください。

+0

申し訳ありませんが、CSVの例を追加しました。しかし、はいそれは一意の条件(A)でしょう。 私の投稿をもう一度チェックしてください!私は助けてくれる編集を加えました! これは明らかです。私はあなたのコードを編集し、私はそれを動作させることができるかどうかを見るつもりです!すべてのあなたの助けをありがとう! –

+0

@Adil Khan、CSVデータサンプルを投稿していただきありがとうございます。 CSVデータ行の列4にDoubleデータ型が含まれているという事実に対応するために、1行のコード改変はわずかです。上記の編集済み投稿を参照してください。 – DevilsHnd

0

私はそのようにします。最初に、1行のデータを表すための単純なクラスを作成し、それをAという名前にします。次に、Aオブジェクトのリストをフィールドとして含むこのデータ・セットのラッパー・クラスBを作成します。このクラスのパブリックメソッドを、パラメータとして渡されたこれらの述語を満たす行に戻します。一意の値を見つけるには、別のクラスで静的パブリックユーティリティメソッドを作成します。このメソッドは、文字列の例リスト(1列)のパラメータとして使用され、Bクラスのメソッドの次に渡すことができる一意の値を返します。あなたはこのように行うことができるユーティリティメソッドに渡す最初の列の値のすなわちリストを取得するには、Java 8のストリームAPIとマップ・メソッドを見てください:

b.getList().stream().map(e -> e.getFirstValue()).collect(Collectors.asList());

+0

ありがとうございました!私は今あなたの方法を試してみると、戻って報告されます! –

関連する問題