2016-12-28 18 views
0

Ich bin neu in Java-Programmierung und ich wurde beauftragt, eine CSV-Datei analysieren und drucken Sie die richtige Zeile der CSV-Datei, durch den Vergleich Spalten z. Die gedruckten Zeilen müssen eine eindeutige 1. und 2. Spalte haben, die 3. Spalte muss "Nein" enthalten und die 4. Spalte muss einen Wert größer oder gleich haben. 12Java: Wie Spalten einer CSV-Datei zu vergleichen und bestimmte Zeilen zu drucken

Es gibt insgesamt 5 Spalten.

Auch ich darf keine Bibliotheken verwenden, die CSV für Sie analysieren.

Hier ist mein Code so weit:

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(); 
      } 
     } 
    } 
} 

}

bearbeiten Beispiel 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 
:

Zum Beispiel so eine Probe CSV-Datei aussehen würde

Also muss der Code eine CSV-Datei nehmen und dann drucken aus den Zeilen, die einen eindeutigen Namen haben (1. Spalte), eindeutige IP (2. Spalte), "Nein" für "Arbeiten?" (3. Spalte) und einen Versionswert über 12.

Ich bin nicht sicher, welche Datenstruktur, die mir erlauben wird, Spalten zu vergleichen.

Ich bin sehr dankbar für jeden Hinweis!

+0

Müssen die erste und die zweite Spalte zueinander oder zur 1. und 2. Spalte der gesamten CSV-Datei eindeutig sein? – DevilsHnd

+0

@DevilsHnd Eindeutig für die gesamte CSV-Datei. Daher muss ich die richtige Zeile aus der CSV-Datei nur ausdrucken, wenn sie allen Anforderungen entspricht. –

+0

In diesem Fall @Adil Khan, überprüfen Sie meine Antwort auf Ihre Frage. – DevilsHnd

Antwort

0

Die Anforderungen in Ihrer Frage sind eher verwirrend und Dinge don‘ Es wird einfacher, wenn keine CSV-Beispieldaten vorhanden sind. Der verwirrende Teil bezieht sich auf die Daten der Spalten 1 und 2 hinsichtlich der Eindeutigkeit. Was halten Sie für EINZIGARTIG?

A) Ist es einzigartig in dem Sinne, dass Spalte 1 und oder Spalte 2 enthält einen String oder numerischen Wert zu sein, die nicht in einer anderen CSV-Datei Zeile dupliziert wird (kein Duplikat in seiner jeweiligen Spalte)?

B) Oder ist es, dass Spalte 1 und oder Spalte 2 in dem Sinne einzigartig zu sein, enthält eine Zeichenfolge oder einen numerischen Wert, der auf sich selbst einzigartig ist und innerhalb dessen in anderen CSV-Datei Leitungen (Duplikaten erlaubt gefunden werden entsprechende Spalte)?

Der folgende Beispielcode geht von einem eindeutigen Zustand aus (A).Das bedeutet dann, wenn eine CSV-Datei die folgenden Komma getrennte Linien enthalten sind dann nur zwei dieser Linien würden die angegebenen Daten Bedingungen erfüllen:

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 

da nur diese beiden Linien haben den Spalten 1 und 2, die auf die wirklich einzigartig sind gesamte CSV-Datei. Kannst du sehen, welche Linien sie sind? Hier

ist der Beispielcode:

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: Nun, da Sie einige Beispieldaten aus der CSV-Datei geschrieben haben ...

Nun, ich war ganz in der Nähe mit meinem säulen CSV Datentyp-Annahmen, aber es muss eine Codeänderung sein, da ich weiß, dass die vierte Datenspalte Double Datentyp Werte enthält.

Sie müssen die Codezeile ändern, die besagt:

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

dieser Codezeile, die den Datentyp Double Werte Griffe:

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

Dies sollten Sie ein wenig helfen, während Sie sind Ändern des Codes nach Ihren Bedürfnissen.

+0

Tut mir leid, ich hätte ein Beispiel CSV hinzufügen sollen! Aber ja, es wäre Unique Condition (A). Überprüfen Sie meine Post bitte noch einmal! Ich habe eine Bearbeitung hinzugefügt, die helfen sollte! Hoffe das macht es klar. Ich werde auch deinen Code bearbeiten und sehen, ob ich es zum Funktionieren bringen kann! Vielen Dank für Ihre Hilfe! –

+0

@Adil Khan, Vielen Dank für die Veröffentlichung Ihrer CSV-Datenprobe. Es gab eine geringfügige Änderung des einzeiligen Codes, um der Tatsache Rechnung zu tragen, dass die Spalte 4 einer CSV-Datenzeile den Datentyp Double enthält. Siehe meinen bearbeiteten Beitrag oben. – DevilsHnd

0

Ich werde es so machen. Erstellen Sie zuerst eine einfache Klasse für die Darstellung einer Datenzeile, lassen Sie sie A genannt werden. Erstellen Sie als Nächstes die Wrapper-Klasse B für diesen Datensatz, der die Liste der A-Objekte als Feld enthält. Stellen Sie die public-Methode für diese Klasse bereit, die die Zeilen zurückgibt, die diese als Parameter übergebenen Vergleichselemente erfüllen. Um eindeutige Werte zu finden, erstellen Sie eine statische öffentliche Hilfsmethode in einer anderen Klasse. Diese Methode verwendet als Parameter für eine Beispielliste von Strings (1 Spalte) einen eindeutigen Wert, den Sie neben der Methode der B-Klasse übergeben können. Schauen Sie sich Java 8 Stream api und Karten Verfahren dh Liste der ersten Spalte Werte zu erhalten, um dieses Dienstprogramm Methode zu übergeben Sie wie folgt tun:

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

+0

Vielen Dank! Ich werde jetzt deine Methode ausprobieren und melde mich wieder! –

Verwandte Themen