2016-08-12 156 views
0

我正在使用Java從文件中收集列數據類型。有些文件是製表符分隔的,有些文件是用逗號分隔的。帶着下面的代碼:String.split() - 如何區分製表符分隔值和逗號分隔值?

String[] valuesFromColumns = null; 
        if (line.split("\\s*\\t\\s*") != null) { 

        System.out.println("Separating by tab: " + line); 
          valuesFromColumns = line.split("\\s*\\t\\s*"); 

        } else if(line.split("\\s*,\\s*")!=null) { 
        System.out.println("Separating by comma." + line); 
          valuesFromColumns = line.split("\\s*,\\s*"); 
        } 

        for(String s : valuesFromColumns) { 
         this.extractDataTypeFromTheLine(s); 
       } 

輸出是不是出了什麼期望:它的失誤逗號分隔的製表符分隔值文件。我可能做錯了什麼? 這裏是輸出:

/Users/macbook/open_data_us/GPL94-tbl-1.txt 
Separating by tab: 67023_at AI342132  Homo sapiens Mar 11, 2009 Consensus sequence GenBank Cluster Incl. AI342132:qt26c08.x1 Homo sapiens cDNA, 3' end /clone=IMAGE-1949102 /clone_end=3' /gb=AI342132 /gi=4079059 /ug=Hs.156499 /len=414 AI342132        
String 
String 
String 
... 
/Users/macbook/open_data_us/Performance Metrics - Transportation.csv 
Separating by tab: Alley Pot Hole,06/06/2011,Week,10,1.65,3,06/06/2011 - 06/12/2011 
String 
/Users/macbook/open_data_us/redditSubmissions.csv 
Separating by tab: 0,1333178161,2012-03-31T14:16:01.093638-07:00,Expectation,35,rmun4,29,GifSound,6,1333203361,23,3,Gangsta_Raper 
String 
+0

我真的不明白你的代碼做錯了什麼,但我發現了一個錯誤。 'split()'永遠不會返回'null'。如果'String'不包含表達式,它將返回一個位置數組並且在第一個位置使用'String':https://docs.oracle.com/javase/7/docs/api/java/lang/String .html#split(java.lang.String,%20int) –

回答

1

line.split沒有返回null時,正則表達式沒有找到任何匹配。相反,它會返回一個整行作爲第一個也是唯一元素的數組。

因此,第一個條件a總是如此。

+0

if(!line.split(「\\ s * \\ t \\ s *」)[0] .equals(line)){ \t \t \t System.out.println(「通過tab分隔:」+ line);}} \t \t \t \t valuesFromColumns = line.split( 「\\ S * \\噸\\ S *」); \t \t \t \t \t \t \t}否則如果(!line.split( 「\\ S *,\\ S *」)[0] .equals(線)){ \t \t \t \t的System.out.println (「用逗號分隔」+行); \t \t \t \t valuesFromColumns = line.split( 「\\ S *,\\ S *」); \t \t \t} \t \t \t \t \t \t爲(字符串S:valuesFromColumns){ \t \t \t \t this.extractDataTypeFromTheLine(一個或多個); \t \t \t} –

+0

我認爲'if(line.contains(「\ t」))'比分割和比較結果與字符串更容易閱讀並且更高效。 – Guenther