2016-09-18 37 views
0

我試圖解析的csv文件包含每個樣本有幾行的各種樣本。例如,有10行具有相同樣本名稱「S1」的行,我需要從每行獲取CT值。我試圖結合CT值(通過目標名稱區分)爲每個樣本創建一個Sample類。我能夠解析該文件,但我很難讓它循環並收集正確的數據。需要幫助解析csv文件並將信息收集在一起

我的Sample類的構造函數有11個參數,一個用於樣本名稱,另一個用於CT值。

經過很長一段時間的思考之後,我試着收集了我需要的所有信息在ArrayList的ArrayList中。這並沒有太多幫助,因爲我現在不知道如何將信息收集在一起來創建Sample類的實例。下面是我的嘗試:

public void parseCSV(){ 

    String line = ""; 
    String csvSplitBy = ","; 

    try 
    { 
     Scanner scanner = new Scanner(new FileReader("/Users/Neema/Desktop/testData.csv")); 

     String[] data; 

     while (scanner.hasNextLine()) 
     { 
      line = scanner.nextLine(); 
      data = line.split(csvSplitBy); 

      if (data.length > 0 && data[0].equals("Well")) 
      { 
       while (scanner.hasNextLine()) 
       { 
        line = scanner.nextLine(); 
        data = line.split(csvSplitBy); 
        if (data.length > 4) 
        { 
         String sampleName = data[3]; 
         String dataType = data[4]; 
         String ctValue = data[11]; 
         String[] gatheredData = {sampleName, dataType, ctValue}; 
         parsedData.add(gatheredData); 
        } 
       } 
      } 
     } 
    } 
    catch (FileNotFoundException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 

下面是CSV文件,testData2

感謝您的幫助!

+0

這是你的Sample類有更多的參數比你從該.csv數據構造的問題? – Prichmp

+0

不一定。每個樣本都有10個數據點,但是每個樣本的每行都有一個數據點。如果所有的數據點都在同一行上,我不會有太大的問題,但是從不同的行中獲取數據並將其與相同的樣本名稱關聯會給我帶來麻煩。 – sparks11

回答

0

我想我明白了。你需要的是樣品工廠。

class SampleFactory { 

    String sampleName; 
    List<TargetAndValue> sampleList; 


    SampleFactory(String sampleName) 
    { 
     this.sampleName = sampleName; 
    } 

    class TargetAndValue{ 
     String dataType; 
     String ctValue; 
     TargetAndValue(dataType, ctValue) 
     { 
      this.dataType = dataType; 
      this.ctValue = ctValue; 
     } 
    } 

    void addCtValue(dataType, ctValue) { //Instantiate a new TargetAndValue class } 

    Sample build(){ //Construct your Sample here } 

} 

比你需要的是一個SampleFactories列表。在解析每行時,您將搜索具有正確sampleName的SampleFactory,並添加數據點。一旦你解析了所有的東西,使用你的工廠來吐出你的Sample對象。

+0

感謝您的回答!我能夠實現這一點,並且運作良好。 – sparks11

+0

Wooo!我幫忙! – Prichmp

0

試試看地圖。例如

public void parseCSV(){ 

    String line = ""; 
    String csvSplitBy = ","; 
    Map<String,List<String>> mapofSamples = new TreeMap<>(); // import java.util.Map; import java.util.TreeMap; 
    try 
    { 
     Scanner scanner = new Scanner(new FileReader("/Users/Neema/Desktop/testData.csv")); 

     String[] data; 

     while (scanner.hasNextLine()) 
     { 
     line = scanner.nextLine(); 
     data = line.split(csvSplitBy); 

     if (data.length > 0 && data[0].equals("Well")) 
     { 
      while (scanner.hasNextLine()) 
      { 
       line = scanner.nextLine(); 
       data = line.split(csvSplitBy); 
       if (data.length > 4) 
       { 
        if(!mapofSamples.containsKey(data[3])){ // if the map does not already contain the sample name add this name and a list with the value 
         mapofSamples.put(data[3],new ArrayList(){{add(data[11]);}}); 
        } 
        else{ 
         mapofSamples.get(data[3]).add(data[11]); // else just add the value to the corresponding sample names value list 
        } 

       } 
      } 
     } 
    } 

    for(String key: mapofSamples.keySet()){  // check if it prints the right keys and values 
     System.out.println("sample :" + key); 
     System.out.println("values :" + mapofSamples.get(key)); 
    } 
} 
catch (FileNotFoundException e) 
{ 
    e.printStackTrace(); 
} 
catch (IOException e) 
{ 
    e.printStackTrace(); 
} 

}

+0

我與示例工廠的答案一起去了,但我相信這也會起作用。感謝您的迴應! – sparks11