2013-08-13 1 views
2

У меня (игры баллы) данные в этом формате:Разбор блоков данных в REBOL

Hotspurs Giants 356 6 275 4 442 3

Ожесточенные Клуб Львов 371 3 2520 5 0 4

Горные Тигры 2519 2 291 6 342 1

Стрельба Stars Club 2430 5 339 1 2472 2

Gun Tooters 329 4 2512 2 2470 6

Banshee Волки 301 1 2436 3 412 5

Первых два/три слов представляют собой название клуба, после чего следует 6 блоков данных в строку, которая представляет клуб круглые в каждом конкретном округлые оценки и индекс противника (начиная с 1). По данным выше, в каждой команде играли 3 раунда. Hotspurs Гиганты (индекс 1) играл Banshee Волки (6) в 1-м раунде забил 356 до банши 301, в раунде 2 Hotspurs Giants играл Shooting Stars Club (4) забил 275 - 339, а в 3-м раунде играл Горные тигры (3) забил 442 для Тигр 342

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

Viz

[Club Round Score Оппонент Оппонент-Score] для каждого клуба

+1

Я должен спросить ... это очень «домашнее задание» ищет проблемы. В StackOverflow [нам все равно] (http://meta.stackexchange.com/questions/123758/can-we-now-discourage-the-use-of-and-burninate-the-homework-tag) * (хотя я мог бы лично предположить, что вопрос будет лучшим вопросом, если в нем будет больше «что вы уже пробовали») *. Мне просто любопытно, кто назначает домашнее задание Rebol, если они есть, и если не там, где проблема возникает ... – HostileFork

+0

Это не домашнее задание, я уверяю вас. Я новичок в Rebol и просто тестирую, как легко/сложно было бы делать то, что я могу легко сказать на PHP в Rebol (и одновременно учиться). Кроме того, кто дал бы 40-летнюю домашнюю работу? – dtechplus

ответ

3

Предполагая data является:

data: [ 
    Hotspurs Giants 356 6 275 4 442 3 
    Fierce Lions Club 371 3 2520 5 0 4 
    Mountain Tigers 2519 2 291 6 342 1 
    Shooting Stars Club 2430 5 339 1 2472 2 
    Gun Tooters 329 4 2512 2 2470 6 
    Banshee Wolves 301 1 2436 3 412 5 
] 

Я думаю, что это решает проблему, пожалуйста, проверьте результат:

clubs: copy [] 
parse data [ 
    some [ 
     copy club some word! 
     copy numbers some number! 
     (append clubs reduce [form club numbers]) 
    | 
     skip 
    ] 
] 
new-line/all/skip clubs yes 2 

list: copy [] 
parse clubs [ 
    some [ 
     set club string! into [ 
      copy numbers some number! (
       i: 1 
       foreach [score index] numbers [ 
        append list reduce [ 
         club score 
         pick clubs index * 2 - 1 
         pick pick clubs index * 2 i 
        ] 
        i: i + 2 
       ] 
      ) 
     ] 
     | skip 
    ] 
] 

new-line/all/skip list yes 4 

Затем, если вам probe clubs вы должны получить:

CLUBS is a block of value: [ 
    "Hotspurs Giants" [356 6 275 4 442 3] 
    "Fierce Lions Club" [371 3 2520 5 0 4] 
    "Mountain Tigers" [2519 2 291 6 342 1] 
    "Shooting Stars Club" [2430 5 339 1 2472 2] 
    "Gun Tooters" [329 4 2512 2 2470 6] 
    "Banshee Wolves" [301 1 2436 3 412 5] 
] 

И если вы probe list выход:

LIST is a block of value: [ 
    "Hotspurs Giants" 356 "Banshee Wolves" 301 
    "Hotspurs Giants" 275 "Shooting Stars Club" 339 
    "Hotspurs Giants" 442 "Mountain Tigers" 342 
    "Fierce Lions Club" 371 "Mountain Tigers" 2519 
    "Fierce Lions Club" 2520 "Gun Tooters" 2512 
    "Fierce Lions Club" 0 "Shooting Stars Club" 2472 
    "Mountain Tigers" 2519 "Fierce Lions Club" 371 
    "Mountain Tigers" 291 "Banshee Wolves" 2436 
    "Mountain Tigers" 342 "Hotspurs Giants" 442 
    "Shooting Stars Club" 2430 "Gun Tooters" 329 
    "Shooting Stars Club" 339 "Hotspurs Giants" 275 
    "Shooting Stars Club" 2472 "Fierce Lions Club" 0 
    "Gun Tooters" 329 "Shooting Stars Club" 2430 
    "Gun Tooters" 2512 "Fierce Lions Club" 2520 
    "Gun Tooters" 2470 "Banshee Wolves" 412 
    "Banshee Wolves" 301 "Hotspurs Giants" 356 
    "Banshee Wolves" 2436 "Mountain Tigers" 291 
    "Banshee Wolves" 412 "Gun Tooters" 2470 
] 
+1

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

+0

Право на точку endo64! Это то, чего я хотел. Тебя ценят. – dtechplus

2

Вот один из примеров (с помощью Rebol 3) показывает, как это можно сделать:

club-data: map [] ; store data in hash map is one option 

foreach line read/lines %games-scores.txt [ 
    fields: split line space 

    ; lets take last 6 cols of data 
    scores: reverse collect [loop 6 [keep to-integer take/last fields]] 

    ; and whats left is the club name 
    club-name: form fields 

    ; build club data 
    club-data/(club-name): scores 
] 

Выше предполагает данные находятся в файле games-scores.txt и возвращают вам карту! (Хэш-карта) называется club-data, где ваши данные клуб будет выглядеть следующим образом:

make map! [ 
    "Hotspurs Giants" [356 6 275 4 442 3] 
    "Fierce Lions Club" [371 3 2520 5 0 4] 
    "Mountain Tigers" [2519 2 291 6 342 1] 
    "Shooting Stars Club" [2430 5 339 1 2472 2] 
    "Gun Tooters" [329 4 2512 2 2470 6] 
    "Banshee Wolves" [301 1 2436 3 412 5] 
] 

Один нюанс ... ЧИТАЙ/ЛИНИЙ будет загружать весь файл в память. Так что если games-scores.txt большой, вы должны посмотреть на использование OPEN вместо этого и прочитать в одной строке за раз.

Обновление - re: ваш комментарий здесь, тот же пример в Rebol 2 [проверен в REBOL/Core 2.7.8.2.5 (2-Jan-2011)]:

club-data: make hash! [] ; of course doesn't have to be hash! 

foreach line read/lines %games-scores.txt [ 
    fields: parse line none 
    scores: reverse collect [loop 6 [keep to-integer take/last fields]] 
    club-name: form fields 
    append club-data reduce [club-name scores] 
] 
+0

Хорошо, но, возможно, я должен был упомянуть, что мне нужно решение Rebol 2. Ценю вашу помощь. – dtechplus

+1

К счастью, для выпуска версии Rebol 2 это не займет много времени - см. Мое обновление на вопрос. – draegtun

+0

Спасибо draegtun. Это хорошая отправная точка для меня. – dtechplus