2016-11-30 2 views
4

\ tTryingを失ったデータセット区切ら:Rubyの文字列の分割は、このタブを分割するために " 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 "' loses '" \ n "'最初に改行を分割し、タブ上でそれらの文字列を分割し、最初の3行の結果の配列が空文字列で終わるかどうかを質問します。 –

答えて

7

これは生産のためであるならば、あなたは@DmitryZはコメントで指摘したようにCSV classを使用する必要があります。 CSV処理には驚くほど多くの警告があり、手作業で行うべきではありません。

しかし、問題は、区切り文字を保持していない、それがNULL列の末尾守らない分割され


...さんは練習としてそれを手放します。あなたは両方の問題にヒットしました。

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、 "limitパラメータが省略されている場合、末尾のヌルフィールドが抑制されている。"、あなたはそれに制限を与えるない限りu = i.split(/\t/)は、その最後のフィールドを無視します。

あなたは常に4つの分野になるだろうとわかっている場合、あなたは4

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

を使用することができます。しかし、それは使用することがおそらくより柔軟だ-1負の[限度がある]場合は、ノーあり」ので、制限されたフィールドの数に制限され、後続のnullフィールドは抑制されません。 ""これにより、CSVの列数をハードコーディングせずに空のフィールドが保持されます。

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

/\ n /まず、問題はそれぞれの問題に現れます。その限界は私が探していたトリックだと思われます。負の制限はすべての見た目のアイテムを展開します。 –

関連する問題