2016-11-30 85 views
4

\ tTrying拆分此製表符分隔的設置數據:上的 「 t」 的紅寶石字符串分割失去 「 n」 個

171 1000 21 
269 1000 25 
389 1000 40 
1020 1-03 30 1 
1058 1-03 30 1 
1074 1-03 30 1 
200 300  500 

(爲了清楚:)

171\t1000\t21\t\n 
269\t1000\t25\t\n 
389\t1000\t40\t\n 
1020\t1-03\t30\t1\n 
1058\t1-03\t30\t1\n 
1074\t1-03\t30\t1\n 
200\t300\t\t500\n 

a = text.split(/\n/) 
a.each do |i| 
    u = i.split(/\t/) 
    puts u.size 
end 

==> 
3 
3 
3 
4 
4 
4 
4 

的\噸\ n組合似乎削減了最後的\ t,我需要進一步輸入。我怎樣才能解決這個問題?乾杯

編輯:這是我所期待的:

4 
4 
4 
4 
4 
4 
4 
+0

您期待的輸出是什麼?這似乎按照預期運行。 –

+1

您應該嘗試使用自定義分隔符的CSV模塊。 CSV.read(「path-to-file.csv」,col_sep:「\ t」) –

+0

我無法理解這個問題。你說「嘗試拆分這個製表符分隔的數據集」,但是你不會說你在分裂什麼。另外,我無法調和「'\ t \ n'組合似乎會刮掉最後一個'\ t',...」,標題爲:「... split on'」\ t「'丟失'」 \ n「'你首先想要在換行符上分割,然後在標籤上分割每個字符串,前三行的結果數組以空字符串結尾?如果可以編輯問題 –

回答

7

如果這是生產,你應該使用作爲@DmitryZ在評論中指出的CSV class。 CSV處理有一個驚人的警告數量,你不應該手工完成。

但讓我們通過它作爲一個練習...


的問題是分不留分隔符,它不保留尾隨空列。你遇到了這兩個問題。

當您運行a = text.split(/\n/)a的元素沒有換行符。

a = [ 
    171\t1000\t21\t 
    269\t1000\t25\t 
    389\t1000\t40\t 
    1020\t1-03\t30\t1 
    1058\t1-03\t30\t1 
    1074\t1-03\t30\t1 
    200\t300\t\t500 
] 

然後,as documented in String#split,「如果省略限制參數,結尾的空場被抑制。」,所以u = i.split(/\t/)將忽略最後一個字段除非你給它一個上限。

如果你知道它總是將是4場,你可以使用4

u = i.split(/\t/, 4) 

但它可能更靈活地使用-1,因爲「如果[限制是]負,沒有限制爲返回的字段數,並且尾部空字段不被抑制。「」這樣可以保留空字段,而不用硬編碼CSV中的列數。

u = i.split(/\t/, -1) 
+0

我正在使用/ \ n /首先,這個問題出現在每一個這個問題上,這個限制似乎是我正在尋找的技巧。負限制擴大了所有明顯的項目。 –