2012-05-28 2 views
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 

Мне нужно, чтобы разобрать его в объект с очевидной позицией, автомобилем, водитель и т.д. поле. Проблема в том, что я понятия не имею, какую стратегию использовать. Если бы я разделил его на пробелы, у меня получился бы такой список:

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

Вы видите проблему. Я не могу просто интерпретировать этот список, потому что у людей может быть только одно имя или 3 слова в имени или много разных слов в машине. Это делает невозможным просто ссылку на список, используя только индексы.

Как насчет использования смещений, определяемых именами столбцов? Я не могу понять, как это можно использовать.

Edit: Так что текущий алгоритм я использую как это работает:

  1. Разделить текст на новой линии дает набор линий.
  2. Найдите общие пробельные символы FURTHEST RIGHT на каждой строке. То есть позиции (индексы) на каждой строке, где каждая другая строка содержит пробелы. EG:
  3. Разделить линии на основе этих общих символов.
  4. Обрезать линии

Несколько вопросов существуют:

Если имена содержат одни и те же длины, как и так:

Jason Adams 
Bobby Sacka 
Jerry Louis 

Тогда он будет интерпретировать это как два отдельных элементов: (["Jason" "Adams", "Bobby", "Sacka", "Jerry", "Louis"]).

Принимая во внимание, если все они отличались примерно так:

Dominic Bou 
Bob Adams 
Jerry Seinfeld 

Тогда было бы правильно разделить на последнем «D» в Сайнфелда (и, таким образом, мы получим набор из трех имен (["Dominic Bou", "Bob Adams", "Jerry Seinfeld"])

.

Это тоже довольно хрупкое. Я ищу более хорошее решение.

+1

Какие инструменты доступны для вас? Unix (sed/awk/cut и т. Д.)? Я думаю, что сокращение Unix справится с этим красиво. – BobS

+0

Ruby, но все, что разрезает, может это сделать (хотя это может быть более болезненно). –

+2

Почему бы просто не разбить на два пространства? – codatory

ответ

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 идентифицирует строки в каждой секции. Я использовал regex:

  • Регулятор head regex ищет строки, которые не содержат цифры.
  • 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"}, 
3

Если нет четкого правила о том, как столбцы разделены, вы не можете это сделать.

Подход, который у вас есть, хорош, если вы знаете, что каждое значение столбца правильно отложено до заголовка столбца.

Другим подходом может быть группировка слов, разделенных ровно одним пространством (из предоставленного вами текста, я вижу, что это правило также выполняется).

+0

Я не думаю, что правило одного пространства выполняется во всех случаях: «Datsun 1200 Coupe»: (Глупый ввод пользователя. –

+0

@ DominicBou-Samra, о, я пропустил этот. В этом случае ваша альтернатива ... –

+0

Давайте посмотрим , ваш ответ кажется, что это невозможно сделать, хотя ясно, что это может быть и довольно легко на самом деле. Так что это проблема. По крайней мере для меня. – pguardiario

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* 

$ 
+2

с использованием regex on данные фиксированной ширины подобны ударным винтам. – pguardiario

4

Если вы можете убедиться в том, что пробелы в символы пробела скорее чем вкладки, и долог текст всегда усекается структуру столбца, то я бы жестко закодировать срезов границы:

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

в зависимости от источника данных, это может быть хрупким (если, например, каждый run имеет разные ширины столбцов).

Если строка заголовка всегда одна и та же, вы можете извлечь границы среза, выполнив поиск известных слов строки заголовка.

+0

«Если строка заголовка всегда одна и та же» - вы имеете в виду, если заголовок является переменным в зависимости от ширины данных? – BobS

+0

@BobS - Я думаю, он имеет в виду, d в строке заголовка всегда одинаковы – pguardiario

2

Предполагая, что текст всегда будет разнесен одинаково, вы можете разбить строку на основе положения, а затем отбросить лишние пробелы вокруг каждой части. Например, в python:

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

и так далее. В качестве альтернативы вы можете определить регулярное выражение для захвата каждой части:

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

и так далее. (Точный синтаксис зависит от вашей грамматики regexp.) Обратите внимание, что регулярное выражение для автомобиля должно обрабатывать добавленные пробелы.

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 
+0

Это не то, что я имел в виду. Вы так относитесь к личному. Дело в том, что у нас есть одно и то же решение, но я считаю, что форматирование данных, как правило, вы этого не делаете. И мы можем согласиться с этим не согласиться. –

+0

Я утверждал: «** Если не существует четкого правила разделения столбцов **, вы не можете этого сделать». Вы, в своем ответе, предположите, что существует разделение между столбцами. Это основная логика. –

+0

Утверждение о том, что решение отсутствует, ** обусловлено тем, что в разделе разделения столбцов нет правила. –

6

http://blog.ryanwood.com/past/2009/6/12/slither-a-dsl-for-parsing-fixed-width-text-files это может решить вашу проблему.

here Есть еще несколько примеров и github.

Надеюсь, это поможет!

+0

Спасибо. Это ... своеобразные работы. Это утомительно, но в данный момент это работает. Я все еще держусь за что-то лучше. –

+0

Если ширина фиксирована, вы можете посмотреть на метод Ruby string 'String # unpack'. Я не смог найти пример в рубине, но вот что-то похожее в perl http://perldoc.perl.org/perlpacktut.html#Packing-Text есть –

4

Хорошо, я gotchu:

Edit: Я забыл упомянуть, его предполагая, что вы припасли свой входной текст в переменная 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"} 
... 

Я оставляю рефакторинга в хороших функций для вас.

+0

Спасибо! Но это немного .. хрупкое.У меня есть тысячи этих файлов, и, к сожалению, они немного меняются в том, как они форматируют вещи. Я думаю, что подход, подобный Slither, является лучшим (определение шаблонов). –

+1

Да, я согласен. Используйте подход с фиксированным интервалом/размером строки. Я просто искал упражнения – AJcodez

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"]] 
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] 

Часть автомобиля может быть выполнена как бы для или во время цикла.

+0

Это не сработает. Как вы правильно разобрали «BMW 325i Sport» против «Porsche 911». Он не учитывает строки с разными пространствами. –

+0

На самом деле это будет работать, потому что это единственная часть с переменным количеством пробелов. Вот почему эта часть будет выполняться чем-то вроде цикла for. он всегда будет начинаться с 6 и заканчиваться на длине массива минус 6. Способ, которым он работает, заключается в том, что длина массива изменяется в зависимости от того, сколько элементов находится в категории транспортного средства –

Смежные вопросы