7

私はこの生のテキストを持っています:

________________________________________________________________________________________________________________________________
Pos Car  Competitor/Team                Driver                   Vehicle              Cap   CL Laps     Race.Time Fastest...Lap

1     6  Jason Clements                 Jason Clements           BMW M3               3200       10     9:48.5710   3 0:57.3228*
2    42  David Skillender               David Skillender         Holden VS Commodore  6000       10     9:55.6866   2 0:57.9409 
3    37  Bruce Cook                     Bruce Cook               Ford  Escort         3759       10     9:56.4388   4 0:58.3359 
4    18  Troy Marinelli                 Troy Marinelli           Nissan  Silvia       3396       10     9:56.7758   2 0:58.4443 
5    75  Anthony Gilbertson             Anthony Gilbertson       BMW M3               3200       10    10:02.5842   3 0:58.9336 
6    26  Trent Purcell                  Trent Purcell            Mazda RX7            2354       10    10:07.6285   4 0:59.0546 
7    12  Scott Hunter                   Scott Hunter             Toyota  Corolla      2000       10    10:11.3722   5 0:59.8921 
8    91  Graeme Wilkinson               Graeme Wilkinson         Ford  Escort         2000       10    10:13.4114   5 1:00.2175 
9     7  Justin Wade                    Justin Wade              BMW M3               4000       10    10:18.2020   9 1:00.8969 
10   55  Greg Craig                     Grag Craig               Toyota  Corolla      1840       10    10:18.9956   7 1:00.7905 
11   46  Kyle Orgam-Moore               Kyle Organ-Moore         Holden VS Commodore  6000       10    10:30.0179   3 1:01.6741 
12   39  Uptiles Strathpine             Trent Spencer            BMW Mini Cooper S    1500       10    10:40.1436   2 1:02.2728 
13  177  Mark Hyde                      Mark Hyde                Ford  Escort         1993       10    10:49.5920   2 1:03.8069 
14   34  Peter Draheim                  Peter Draheim            Mazda RX3            2600       10    10:50.8159  10 1:03.4396 
15    5  Scott Douglas                  Scott Douglas            Datsun  1200         1998        9     9:48.7808   3 1:01.5371 
16   72  Paul Redman                    Paul Redman              Ford  Focus          2lt         9    10:11.3707   2 1:05.8729 
17    8  Matthew Speakman               Matthew Speakman         Toyota  Celica       1600        9    10:16.3159   3 1:05.9117 
18   74  Lucas Easton                   Lucas Easton             Toyota  Celica       1600        9    10:16.8050   6 1:06.0748 
19   77  Dean Fuller                    Dean Fuller              Mitsubishi  Sigma    2600        9    10:25.2877   3 1:07.3991 
20   16  Brett Batterby                 Brett Batterby           Toyota  Corolla      1600        9    10:29.9127   4 1:07.8420 
21   95  Ross Hurford                   Ross Hurford             Toyota  Corolla      1600        8     9:57.5297   2 1:12.2672 
DNF  13  Charles Wright                 Charles Wright           BMW 325i             2700        9     9:47.9888   7 1:03.2808 
DNF  20  Shane Satchwell                Shane Satchwell          Datsun  1200 Coupe   1998        1     1:05.9100   1 1:05.9100 

Fastest Lap Av.Speed Is 152kph, Race Av.Speed Is 148kph
R=under lap record by greatest margin, r=under lap record, *=fastest lap time
________________________________________________________________________________________________________________________________
Issue# 2 - Printed Sat May 26 15:43:31 2012                     Timing System By NATSOFT (03)63431311 www.natsoft.com.au/results
Amended 

明らかなPosition、Car、Driverなどのフィールドを持つオブジェクトに解析する必要があります。問題は、どのような戦略を使うべきかわからないことです。空白で分割すると、次のようなリストになります。

["1", "6", "Jason", "Clements", "Jason", "Clements", "BMW", "M3", "3200", "10", "9:48.5710", "3", "0:57.3228*"]

問題がわかりますか。私はこのリストを単に解釈することはできません。なぜなら、人々は名前が1つしかない場合もあれば、名前に3つの単語が含まれている場合もあるし、車の中にはさまざまな単語が含まれている場合もあるからです。インデックスだけを使ってリストを参照することは不可能です。

列名で定義されたオフセットを使用するのはどうですか?しかし、それがどのように使用されるのかはよくわかりません。

編集:したがって、私が使用している現在のアルゴリズムは次のように機能します。

  1. 新しい行でテキストを分割して、行のコレクションを作成します。
  2. 各行で一般的な空白文字FURTHESTRIGHTを見つけます。つまり、1行おきに空白が含まれる各行の位置(インデックス)。例えば:
  3. それらの一般的な文字に基づいて行を分割します。
  4. 行をトリミングします

いくつかの問題があります。

名前に次のように同じ長さが含まれている場合:

Jason Adams
Bobby Sacka
Jerry Louis

次に、それを2つの別個の項目として解釈します:([ "Jason" "Adams", "Bobby", "Sacka", "Jerry", "Louis"])。

一方、それらがすべてそのように異なっていた場合:

Dominic Bou
Bob Adams
Jerry Seinfeld

次に、サインフェルドの最後の「d」で正しく分割されます(したがって、3つの名前のコレクションを取得します(["Dominic Bou", "Bob Adams", "Jerry Seinfeld"])。

また、かなりもろいです。私はより良い解決策を探しています。

4

10 に答える 10

6

これは正規表現には適していません。フォーマットを見つけてから、次の行を解凍する必要があります。

lines = str.split "\n"

# you know the field names so you can use them to find the column positions
fields = ['Pos', 'Car', 'Competitor/Team', 'Driver', 'Vehicle', 'Cap', 'CL Laps', 'Race.Time', 'Fastest...Lap']
header = lines.shift until header =~ /^Pos/
positions = fields.map{|f| header.index f}

# use that to construct an unpack format string
format = 1.upto(positions.length-1).map{|x| "A#{positions[x] - positions[x-1]}"}.join
# A4A5A31A25A21A6A12A10

lines.each do |line|
  next unless line =~ /^(\d|DNF)/ # skip lines you're not interested in
  data = line.unpack(format).map{|x| x.strip}
  puts data.join(', ')
  # or better yet...
  car = Hash[fields.zip data]
  puts car['Driver']
end
于 2012-05-29T05:54:35.853 に答える
6

http://blog.ryanwood.com/past/2009/6/12/slither-a-dsl-for-parsing-fixed-width-text-filesこれで問題が解決する場合があります。

ここにいくつかの例とgithubがあります。

お役に立てれば!

于 2012-07-19T09:02:29.283 に答える
5

各線の固定幅を使うだけでも簡単だと思います。

#!/usr/bin/env ruby

# ruby parsing_winner.rb winners_list.txt 
args = ARGV
puts "ruby parsing_winner.rb winners_list.txt " if args.empty?
winner_file = open args.shift
array_of_race_results, array_of_race_results_array  = [], []

class RaceResult

  attr_accessor :position, :car, :team, :driver, :vehicle, :cap, :cl_laps, :race_time, :fastest, :fastest_lap
  def initialize(position, car, team, driver, vehicle, cap, cl_laps, race_time, fastest, fastest_lap)
    @position    = position 
    @car         = car 
    @team        = team  
    @driver      = driver  
    @vehicle     = vehicle  
    @cap         = cap  
    @cl_laps     = cl_laps  
    @race_time   = race_time 
    @fastest     = fastest
    @fastest_lap = fastest_lap 
  end

  def to_a
    # ["1", "6", "Jason", "Clements", "Jason", "Clements", "BMW", "M3", "3200", "10", "9:48.5710", "3", "0:57.3228*"]
    [position, car, team, driver, vehicle, cap, cl_laps, race_time, fastest, fastest_lap]
  end
end

# Pos Car  Competitor/Team                Driver                   Vehicle              Cap   CL Laps     Race.Time Fastest...Lap

# 1     6  Jason Clements                 Jason Clements           BMW M3               3200       10     9:48.5710   3 0:57.3228*
# 2    42  David Skillender               David Skillender         Holden VS Commodore  6000       10     9:55.6866   2 0:57.9409
# etc...
winner_file.each_line do |line|
  next if line[/^____/] || line[/^\w{4,}|^\s|^Pos/] || line[0..3][/\=/]
  position    = line[0..3].strip
  car         = line[4..8].strip
  team        = line[9..39].strip
  driver      = line[40..64].strip
  vehicle     = line[65..85].strip
  cap         = line[86..91].strip
  cl_laps     = line[92..101].strip
  race_time   = line[102..113].strip
  fastest     = line[114..116].strip
  fastest_lap = line[117..-1].strip
  racer = RaceResult.new(position, car, team, driver, vehicle, cap, cl_laps, race_time, fastest, fastest_lap)
  array_of_race_results << racer
  array_of_race_results_array << racer.to_a
end

puts "Race Results Objects: #{array_of_race_results}"
puts "Race Results: #{array_of_race_results_array.inspect}"

出力=>

Race Results Objects: [#<RaceResult:0x007fcc4a84b7c8 @position="1", @car="6", @team="Jason Clements", @driver="Jason Clements", @vehicle="BMW M3", @cap="3200", @cl_laps="10", @race_time="9:48.5710", @fastest="3", @fastest_lap="0:57.3228*">, #<RaceResult:0x007fcc4a84aa08 @position="2", @car="42", @team="David Skillender", @driver="David Skillender", @vehicle="Holden VS Commodore", @cap="6000", @cl_laps="10", @race_time="9:55.6866", @fastest="2", @fastest_lap="0:57.9409">, #<RaceResult:0x007fcc4a849ce8 @position="3", @car="37", @team="Bruce Cook", @driver="Bruce Cook", @vehicle="Ford  Escort", @cap="3759", @cl_laps="10", @race_time="9:56.4388", @fastest="4", @fastest_lap="0:58.3359">, #<RaceResult:0x007fcc4a8491f8 @position="4", @car="18", @team="Troy Marinelli", @driver="Troy Marinelli", @vehicle="Nissan  Silvia", @cap="3396", @cl_laps="10", @race_time="9:56.7758", @fastest="2", @fastest_lap="0:58.4443">, #<RaceResult:0x007fcc4b091ab8 @position="5", @car="75", @team="Anthony Gilbertson", @driver="Anthony Gilbertson", @vehicle="BMW M3", @cap="3200", @cl_laps="10", @race_time="10:02.5842", @fastest="3", @fastest_lap="0:58.9336">, #<RaceResult:0x007fcc4b0916a8 @position="6", @car="26", @team="Trent Purcell", @driver="Trent Purcell", @vehicle="Mazda RX7", @cap="2354", @cl_laps="10", @race_time="10:07.6285", @fastest="4", @fastest_lap="0:59.0546">, #<RaceResult:0x007fcc4b091298 @position="7", @car="12", @team="Scott Hunter", @driver="Scott Hunter", @vehicle="Toyota  Corolla", @cap="2000", @cl_laps="10", @race_time="10:11.3722", @fastest="5", @fastest_lap="0:59.8921">, #<RaceResult:0x007fcc4b090e88 @position="8", @car="91", @team="Graeme Wilkinson", @driver="Graeme Wilkinson", @vehicle="Ford  Escort", @cap="2000", @cl_laps="10", @race_time="10:13.4114", @fastest="5", @fastest_lap="1:00.2175">, #<RaceResult:0x007fcc4b090a78 @position="9", @car="7", @team="Justin Wade", @driver="Justin Wade", @vehicle="BMW M3", @cap="4000", @cl_laps="10", @race_time="10:18.2020", @fastest="9", @fastest_lap="1:00.8969">, #<RaceResult:0x007fcc4b090668 @position="10", @car="55", @team="Greg Craig", @driver="Grag Craig", @vehicle="Toyota  Corolla", @cap="1840", @cl_laps="10", @race_time="10:18.9956", @fastest="7", @fastest_lap="1:00.7905">, #<RaceResult:0x007fcc4b090258 @position="11", @car="46", @team="Kyle Orgam-Moore", @driver="Kyle Organ-Moore", @vehicle="Holden VS Commodore", @cap="6000", @cl_laps="10", @race_time="10:30.0179", @fastest="3", @fastest_lap="1:01.6741">, #<RaceResult:0x007fcc4b08fe48 @position="12", @car="39", @team="Uptiles Strathpine", @driver="Trent Spencer", @vehicle="BMW Mini Cooper S", @cap="1500", @cl_laps="10", @race_time="10:40.1436", @fastest="2", @fastest_lap="1:02.2728">, #<RaceResult:0x007fcc4b08fa38 @position="13", @car="177", @team="Mark Hyde", @driver="Mark Hyde", @vehicle="Ford  Escort", @cap="1993", @cl_laps="10", @race_time="10:49.5920", @fastest="2", @fastest_lap="1:03.8069">, #<RaceResult:0x007fcc4b08f628 @position="14", @car="34", @team="Peter Draheim", @driver="Peter Draheim", @vehicle="Mazda RX3", @cap="2600", @cl_laps="10", @race_time="10:50.8159", @fastest="10", @fastest_lap="1:03.4396">, #<RaceResult:0x007fcc4b08f218 @position="15", @car="5", @team="Scott Douglas", @driver="Scott Douglas", @vehicle="Datsun  1200", @cap="1998", @cl_laps="9", @race_time="9:48.7808", @fastest="3", @fastest_lap="1:01.5371">, #<RaceResult:0x007fcc4b08ee08 @position="16", @car="72", @team="Paul Redman", @driver="Paul Redman", @vehicle="Ford  Focus", @cap="2lt", @cl_laps="9", @race_time="10:11.3707", @fastest="2", @fastest_lap="1:05.8729">, #<RaceResult:0x007fcc4b08e9f8 @position="17", @car="8", @team="Matthew Speakman", @driver="Matthew Speakman", @vehicle="Toyota  Celica", @cap="1600", @cl_laps="9", @race_time="10:16.3159", @fastest="3", @fastest_lap="1:05.9117">, #<RaceResult:0x007fcc4b08e5e8 @position="18", @car="74", @team="Lucas Easton", @driver="Lucas Easton", @vehicle="Toyota  Celica", @cap="1600", @cl_laps="9", @race_time="10:16.8050", @fastest="6", @fastest_lap="1:06.0748">, #<RaceResult:0x007fcc4b08e1d8 @position="19", @car="77", @team="Dean Fuller", @driver="Dean Fuller", @vehicle="Mitsubishi  Sigma", @cap="2600", @cl_laps="9", @race_time="10:25.2877", @fastest="3", @fastest_lap="1:07.3991">, #<RaceResult:0x007fcc4b08ddc8 @position="20", @car="16", @team="Brett Batterby", @driver="Brett Batterby", @vehicle="Toyota  Corolla", @cap="1600", @cl_laps="9", @race_time="10:29.9127", @fastest="4", @fastest_lap="1:07.8420">, #<RaceResult:0x007fcc4a848348 @position="21", @car="95", @team="Ross Hurford", @driver="Ross Hurford", @vehicle="Toyota  Corolla", @cap="1600", @cl_laps="8", @race_time="9:57.5297", @fastest="2", @fastest_lap="1:12.2672">, #<RaceResult:0x007fcc4a847948 @position="DNF", @car="13", @team="Charles Wright", @driver="Charles Wright", @vehicle="BMW 325i", @cap="2700", @cl_laps="9", @race_time="9:47.9888", @fastest="7", @fastest_lap="1:03.2808">, #<RaceResult:0x007fcc4a847010 @position="DNF", @car="20", @team="Shane Satchwell", @driver="Shane Satchwell", @vehicle="Datsun  1200 Coupe", @cap="1998", @cl_laps="1", @race_time="1:05.9100", @fastest="1", @fastest_lap="1:05.9100">]
Race Results: [["1", "6", "Jason Clements", "Jason Clements", "BMW M3", "3200", "10", "9:48.5710", "3", "0:57.3228*"], ["2", "42", "David Skillender", "David Skillender", "Holden VS Commodore", "6000", "10", "9:55.6866", "2", "0:57.9409"], ["3", "37", "Bruce Cook", "Bruce Cook", "Ford  Escort", "3759", "10", "9:56.4388", "4", "0:58.3359"], ["4", "18", "Troy Marinelli", "Troy Marinelli", "Nissan  Silvia", "3396", "10", "9:56.7758", "2", "0:58.4443"], ["5", "75", "Anthony Gilbertson", "Anthony Gilbertson", "BMW M3", "3200", "10", "10:02.5842", "3", "0:58.9336"], ["6", "26", "Trent Purcell", "Trent Purcell", "Mazda RX7", "2354", "10", "10:07.6285", "4", "0:59.0546"], ["7", "12", "Scott Hunter", "Scott Hunter", "Toyota  Corolla", "2000", "10", "10:11.3722", "5", "0:59.8921"], ["8", "91", "Graeme Wilkinson", "Graeme Wilkinson", "Ford  Escort", "2000", "10", "10:13.4114", "5", "1:00.2175"], ["9", "7", "Justin Wade", "Justin Wade", "BMW M3", "4000", "10", "10:18.2020", "9", "1:00.8969"], ["10", "55", "Greg Craig", "Grag Craig", "Toyota  Corolla", "1840", "10", "10:18.9956", "7", "1:00.7905"], ["11", "46", "Kyle Orgam-Moore", "Kyle Organ-Moore", "Holden VS Commodore", "6000", "10", "10:30.0179", "3", "1:01.6741"], ["12", "39", "Uptiles Strathpine", "Trent Spencer", "BMW Mini Cooper S", "1500", "10", "10:40.1436", "2", "1:02.2728"], ["13", "177", "Mark Hyde", "Mark Hyde", "Ford  Escort", "1993", "10", "10:49.5920", "2", "1:03.8069"], ["14", "34", "Peter Draheim", "Peter Draheim", "Mazda RX3", "2600", "10", "10:50.8159", "10", "1:03.4396"], ["15", "5", "Scott Douglas", "Scott Douglas", "Datsun  1200", "1998", "9", "9:48.7808", "3", "1:01.5371"], ["16", "72", "Paul Redman", "Paul Redman", "Ford  Focus", "2lt", "9", "10:11.3707", "2", "1:05.8729"], ["17", "8", "Matthew Speakman", "Matthew Speakman", "Toyota  Celica", "1600", "9", "10:16.3159", "3", "1:05.9117"], ["18", "74", "Lucas Easton", "Lucas Easton", "Toyota  Celica", "1600", "9", "10:16.8050", "6", "1:06.0748"], ["19", "77", "Dean Fuller", "Dean Fuller", "Mitsubishi  Sigma", "2600", "9", "10:25.2877", "3", "1:07.3991"], ["20", "16", "Brett Batterby", "Brett Batterby", "Toyota  Corolla", "1600", "9", "10:29.9127", "4", "1:07.8420"], ["21", "95", "Ross Hurford", "Ross Hurford", "Toyota  Corolla", "1600", "8", "9:57.5297", "2", "1:12.2672"], ["DNF", "13", "Charles Wright", "Charles Wright", "BMW 325i", "2700", "9", "9:47.9888", "7", "1:03.2808"], ["DNF", "20", "Shane Satchwell", "Shane Satchwell", "Datsun  1200 Coupe", "1998", "1", "1:05.9100", "1", "1:05.9100"]]
于 2012-07-22T19:48:53.033 に答える
4

フォーマットの一貫性に応じて、おそらくこれに正規表現を使用できます。

これは、現在のデータに対して機能する正規表現のサンプルです。正確なルールによっては微調整が必​​要になる場合がありますが、次のようなアイデアが得られます。

^

# Pos
(\d+|DNF)
\s+

#Car
(\d+)
\s+

# Team
([\w-]+(?: [\w-]+)+)
\s+

# Driver
([\w-]+(?: [\w-]+)+)
\s+

# Vehicle
([\w-]+(?:  ?[\w-]+)+)
\s+

# Cap
(\d{4}|\dlt)
\s+

# CL Laps
(\d+)
\s+

# Race.Time
(\d+:\d+\.\d+)
\s+

# Fastest Lap
(\d+)
\s+

# Fastest Lap Time
(\d+:\d+\.\d+\*?)
\s*

$
于 2012-05-28T23:18:47.663 に答える
4

空白がタブではなくスペース文字であり、長すぎるテキストが常に列構造に合うように切り捨てられることを確認できる場合は、スライスの境界をハードコーディングします。

parsed = [rawLine[0:3],rawLine[4:7],rawLine[9:38], ...etc... ]

データソースによっては、これは脆弱な場合があります(たとえば、実行ごとに列幅が異なる場合)。

ヘッダー行が常に同じである場合は、ヘッダー行の既知の単語を検索することでスライス境界を抽出できます。

于 2012-05-28T23:20:22.380 に答える
4

あなたはfixed_width宝石を使うことができます。

指定されたファイルは、次のコードで解析できます。

require 'fixed_width'
require 'pp'

FixedWidth.define :cars do |d|
  d.head do |head|
    head.trap { |line| line !~ /\d/ }
  end
  d.body do |body|
    body.trap { |line| line =~ /^(\d|DNF)/ }
    body.column :pos, 4
    body.column :car, 5
    body.column :competitor, 31
    body.column :driver, 25
    body.column :vehicle, 21
    body.column :cap, 5
    body.column :cl_laps, 11
    body.column :race_time, 11
    body.column :fast_lap_no, 4
    body.column :fast_lap_time, 10
  end
end

pp FixedWidth.parse(File.open("races.txt"), :cars)

このtrapメソッドは、各セクションの行を識別します。私は正規表現を使用しました:

  • head正規表現は、数字を含まない行を探します。
  • body正規表現は、数字または「DNF」で始まる行を検索します

各セクションには、最後の直後の行を含める必要があります。定義はcolumn、取得する列の数を識別するだけです。ライブラリは空白を取り除きます。固定幅のファイルを作成したい場合は、配置パラメータを追加できますが、それが必要になるとは思われません。

結果は、次のように始まるハッシュです。

{:head=>[{}, {}, {}],
 :body=>
  [{:pos=>"1",
    :car=>"6",
    :competitor=>"Jason Clements",
    :driver=>"Jason Clements",
    :vehicle=>"BMW M3",
    :cap=>"3200",
    :cl_laps=>"10",
    :race_time=>"9:48.5710",
    :fast_lap_no=>"3",
    :fast_lap_time=>"0:57.3228"},
   {:pos=>"2",
    :car=>"42",
    :competitor=>"David Skillender",
    :driver=>"David Skillender",
    :vehicle=>"Holden VS Commodore",
    :cap=>"6000",
    :cl_laps=>"10",
    :race_time=>"9:55.6866",
    :fast_lap_no=>"2",
    :fast_lap_time=>"0:57.9409"},
于 2012-07-20T01:41:05.310 に答える
4

了解しました。

編集:私は言及するのを忘れました、それはあなたがあなたの入力テキストを変数に保存したと仮定していますinput_string

# Choose a delimeter that is unlikely to occure
DELIM = '|||'

# DRY -> extend String
class String
  def split_on_spaces(min_spaces = 1)
    self.strip.gsub(/\s{#{min_spaces},}/, DELIM).split(DELIM)
  end
end

# just get the data lines
lines = input_string.split("\n")
lines = lines[2...(lines.length - 4)].delete_if { |line|
  line.empty?
}

# Grab all the entries into a nice 2-d array
entries = lines.map { |line|
  [
    line[0..8].split_on_spaces,
    line[9..85].split_on_spaces(3).map{ |string| 
      string.gsub(/\s+/, ' ')  # replace whitespace with 1 space
    },
    line[85...line.length].split_on_spaces(2)

  ].flatten
}

# BONUS

# Make nice hashes
keys = [:pos, :car, :team, :driver, :vehicle, :cap, :cl_laps, :race_time, :fastest_lap]
objects = entries.map { |entry|
  Hash[keys.zip entry]
}

出力:

entries # =>
["1", "6", "Jason Clements", "Jason Clements", "BMW M3", "3200", "10", "9:48.5710", "3 0:57.3228*"]
["2", "42", "David Skillender", "David Skillender", "Holden VS Commodore", "6000", "10", "9:55.6866", "2 0:57.9409"]
...
# all of length 9, no extra spaces

そして、アレイがそれをカットしない場合に備えて

objects # =>
{:pos=>"1", :car=>"6", :team=>"Jason Clements", :driver=>"Jason Clements", :vehicle=>"BMW M3", :cap=>"3200", :cl_laps=>"10", :race_time=>"9:48.5710", :fastest_lap=>"3 0:57.3228*"}
{:pos=>"2", :car=>"42", :team=>"David Skillender", :driver=>"David Skillender", :vehicle=>"Holden VS Commodore", :cap=>"6000", :cl_laps=>"10", :race_time=>"9:55.6866", :fastest_lap=>"2 0:57.9409"}
...

私はそれをあなたに素晴らしい機能にリファクタリングすることを任せます。

于 2012-07-20T20:10:58.507 に答える
3

列の分離方法に明確なルールがない限り、実際にそれを行うことはできません。

各列の値が列のタイトルに適切にインデントされていることがわかっている場合、現在のアプローチは適切です。

別のアプローチは、正確に1つのスペースで区切られた単語をグループ化することです(提供したテキストから、このルールも当てはまることがわかります)。

于 2012-05-28T23:10:52.263 に答える
2

テキストの間隔が常に同じであると仮定すると、位置に基づいて文字列を分割し、各部分の周りの余分なスペースを取り除くことができます。たとえば、Pythonでは次のようになります。

pos=row[0:3].strip()
car=row[4:7].strip()

等々。または、正規表現を定義して各部分をキャプチャすることもできます。

([:alnum:]+)\s([:num:]+)\s(([:alpha:]+ )+)\s(([:alpha:]+ )+)\s(([:alpha:]* )+)\s

等々。(正確な構文は、正規表現の文法によって異なります。)car regexpは、追加されたスペースを処理する必要があることに注意してください。

于 2012-05-28T23:21:04.173 に答える
1

これをコーディングするつもりはありませんが、上記のデータセットで確実に機能する1つの方法は、空白で解析してから、次のように要素を割り当てることです。

someArray = array of strings that were split by white space

Pos = someArray[0]
Car = someArray[1]
Competitor/Team = someArray[2] + " " + someArray[3]
Driver = someArray[4] + " " + someArray[5]
Vehicle = someArray[6] + " " + ... + " " + someArray[someArray.length - 6]
Cap = someArray[someArray.length - 5]
CL Laps = someArray[someArray.length - 4]
Race.Time = someArray[someArray.length - 3]
Fastest...Lap = someArray[someArray.length - 2] + " " + someArray[someArray.length - 1]

車両部分は、ある種のforまたはwhileループで実行できます。

于 2012-07-25T04:19:56.813 に答える