サンプルデータは、データベース抽出から表示される標準のパイプ区切り('|'
)ファイルのように見えます。||
null値のフィールドが出力のように表示されるのはよくあることです。
正規表現を使用して解析しようとするのではなく、通常、パイプで分割するか、列区切り文字としてコンマではなくパイプを使用したCSVレコードとして処理します。||
フィールドに実際にコンテンツが含まれているレコードを取得した場合、ダブルパイプ()での分割は失敗します。
これが私がそれを行う方法を示す2つの異なるサンプルです。|
1つ目は、フィールドへの分割です。
text = '894975||0||Lever 2000 Anti-Bacterial Bar Soap ||Health & Spa/Personal Care/Body Care/Soap'
fields = text.split('|')
fields
この時点で次のようになります。
[
[0] "894975",
[1] "",
[2] "0",
[3] "",
[4] "Lever 2000 Anti-Bacterial Bar Soap ",
[5] "",
[6] "Health & Spa/Personal Care/Body Care/Soap"
]
5番目のフィールドを取得すると、製品が取得されます。
product = fields[4]
=> "Lever 2000 Anti-Bacterial Bar Soap"
|
これを行う2番目の方法は、コンテンツを区切り文字付きのCSVファイルとして扱うことです。
require 'csv'
text = <<EOT
894975||0||Lever 2000 Anti-Bacterial Bar Soap ||Health & Spa/Personal Care/Body Care/Soap
EOT
CSV.parse(text, :col_sep => '|') do |row|
puts row[4]
end
=> "Lever 2000 Anti-Bacterial Bar Soap"
|
CSVを使用してこれを行う利点は、テキスト内の文字を見つけることができることです。CSVは、埋め込まれたパイプのデコードを正しく処理します。
サンプル入力ラインは1つしかないため、このソリューションをこれ以上徹底することはできません。