2016-10-31 22 views
3

私の呼び出しに関する請求データを含むテキストファイルからCSVファイルを作成する必要があります。これは、単数形の名前を持っている都市のために働くが、明らかにそれはラス」、「ニューヨーク」のためではないんRubyのテキストファイルからCSVを作成する方法

require 'csv' 
    @calls = File.new("modified_billing", "r") 
    CSV.open("new.csv", 'wb', write_headers: true, 
    headers: ["Date", "Time", "Phone number","City","Duration", "Cost", "Cost of call"]) do |csv| 
    @calls.each do |call| 
     csv << call.split(" ") 
    end 
    end 

を:私は使用してCSVを作成

01.02.2016 10:35:49 8998775 New York 3:35 0,00 0,00 

:私のテキストファイルは次のような構造を持っていますラスベガス "など、2つの列を作成するためです。

+1

あなたが取得するテキストファイルが毎回同じ形式になるかどうかを特定する必要があります。あなたのテキストファイルのパターンを見ると、正規表現を使って数字部分を 'New York'まで切り捨て、それを切り捨てて残りのデータを処理することができます。 –

+1

ありがとうございましたお互いに別々の数字? – Jes

答えて

5

あなたはほとんどそれを持っていると思います。ここでは正規表現せずにそれを行うための簡単な方法があります:

string = '01.02.2016 10:35:49 8998775 New York 3:35 0,00 0,00' 
data = string.split(' ') 

data.shift(3) 
# => ["01.02.2016", "10:35:49", "8998775"] 

data.pop(3) 
# => ["3:35", "0,00", "0,00"] 

data.join(' ') 
# => "New York" 

# putting it together 
first, third, second = data.shift(3), data.pop(3), [data.join(' ')] 
csv << first + second + third 

読むには少し難しいけれども、よりコンパクトな何か、:

data = call.split(' ') 
csv << [data.shift(3), data.pop(3)].insert(1, data.join(' ')).flatten 

+2

非常に良い! OPの最後のステップを追加して、一緒に引っ張るべきです... 'first = data.shift(3);第3 = data.pop(3); 2番目= [データ。結合( '')]; csv << first + second + third' – SteveTurczyn

+0

するでしょう!ありがとう:) –

+0

ヘクタール、さらに良い:) – SteveTurczyn

0

ここではあなたの例に一致する正規表現です。他の回線がなければ、すべての通話でうまく動作するかどうかは分かりません。 Regexpと一致しない呼び出しに対して、「解析できません」という警告が表示されます。 スペースやタブが複数ある場合は、 '' by '\ s +'をすべて置き換えることができます。

if call=~/(\d\d\.\d\d\.\d\d\d\d) (\d\d:\d\d:\d\d) (\d+) (.*?) (\d+:\d\d) (\d+,\d\d) (\d+,\d\d)/ then 
    csv << Regexp.last_match.captures 
else 
    puts "Cannot parse : #{call}" 
end 
+0

あなたの正規表現は大幅に簡略化することができます。 '{n}'を使うか、あるいは捕捉していないグループを繰り返すかを見てください。 –

+0

もちろん、\ d \ dではなく\ d {2}を使うことができますが、私はそれをより読みやすく見つけられず、実際はもっと長くなります。 \ d {4}はそれだけの価値があります。また、配列を直接取得するために、すべてのグループをキャプチャしたいと思います。あなたの例はどのように見えるでしょうか?あなたがニックピッキングしたい場合は、 "および/または"単に "または" http://www.ewriteonline.com/using-andor-in-a-sentence-is-just-plain-dumb/;) –

3

これを解決する方法があります。ここでは、私が過去に同様のことをやった方法は次のとおりです。

str = '01.02.2016 10:35:49 8998775 New York 3:35 0,00 0,00' 
/(\S+) (\S+) (\d+) (.+) (\S+) (\S+) (\S+)/.match(str).captures 
# => ["01.02.2016", "10:35:49", "8998775", "New York", "3:35", "0,00", "0,00"] 

str = '01.02.2016 10:35:49 8998775 Chicago 3:35 0,00 0,00' 
/(\S+) (\S+) (\d+) (.+) (\S+) (\S+) (\S+)/.match(str).captures 
# => ["01.02.2016", "10:35:49", "8998775", "Chicago", "3:35", "0,00", "0,00"] 

あなたはフィールドは通常、あなたがあなたの利点にそれらを使用することができます区切られた空間を知っているので。

あなたはもう少しフィールドを検証する必要がある場合:

str = '01.02.2016 10:35:49 8998775 New York 3:35 0,00 0,00' 
/([\d.]+) ([\d:]+) (\d+) (\D+?) ([\d+:]+) ([\d,]+) ([\d,]+)/.match(str).captures 
# => ["01.02.2016", "10:35:49", "8998775", "New York", "3:35", "0,00", "0,00"] 

str = '01.02.2016 10:35:49 8998775 Chicago 3:35 0,00 0,00' 
/([\d.]+) ([\d:]+) (\d+) (\D+?) ([\d+:]+) ([\d,]+) ([\d,]+)/.match(str).captures 
# => ["01.02.2016", "10:35:49", "8998775", "Chicago", "3:35", "0,00", "0,00"] 

時々私が使用したものを、よりテンプレートのように:

str = '01.02.2016 10:35:49 8998775 New York 3:35 0,00 0,00' 
/((?:\d{2}\.){2}\d{4}) ((?:\d{2}:){2}\d{2}) (\d+) (\D+?) (\d+:\d+) ([\d,]+) ([\d,]+)/.match(str).captures 
# => ["01.02.2016", "10:35:49", "8998775", "New York", "3:35", "0,00", "0,00"] 

str = '01.02.2016 10:35:49 8998775 Chicago 3:35 0,00 0,00' 
/((?:\d{2}\.){2}\d{4}) ((?:\d{2}:){2}\d{2}) (\d+) (\D+?) (\d+:\d+) ([\d,]+) ([\d,]+)/.match(str).captures 
# => ["01.02.2016", "10:35:49", "8998775", "Chicago", "3:35", "0,00", "0,00"] 

  • \d{2}手段"2桁"
  • (?:\d{2}\.)は「グループとして2桁と.を考慮したが捕捉しない(」記憶「)を意味し、それを。
  • (?:\d{2}\.){2}手段 『は二度それを行うすべてのことに加えて、次のを覚えている』。
  • ((?:\d{2}\.){2}\d{4})意味」パターンは、それは彼らが繰り返し回数を考え出すの問題だ考え出しされると。ソース場合は4桁の数字」。

あなたはパターンの残りの部分をうまくできることを知って。

利点がありますt extが後で変更されると、数値を微調整するのはかなり簡単です。そして、これは正規表現の力です。繰り返すパターンがあるときは素晴らしいです。

正規表現は壊れやすく、エンジンの解析方法がわからない場合はのようになります。コードをスローダウンすることができます。代わりにDamien'sのようなものを使って、splitを使用して文字列を分解し、次にshiftpopという都市を残しました。

+0

素敵な説明!私はガールフレンドが言うときにそれを愛する "(?:\ d {2} \。){2}" –

関連する問題