2012-05-09 7 views
1

У меня есть файл csv с некоторыми дополнительными параметрами. Я не хочу писать свой собственный парсер, поскольку я знаю, что там много хороших. Проблема в том, что я unsurtan, если есть какой-либо парсер, который мог бы обрабатывать мой сценарий. Мой файл CSV выглядит следующим образом:Разбор вида csv-файла

The CSV file

Я хотел бы сначала прочитать вторую строки ниже # ADM поэтому в данном случае 3 линии. И я хотел бы прочитать вторую строку после # Prov.

Есть ли хороший синтаксический анализатор или считыватель, который я мог бы использовать, что помогло бы мне в этом, и как бы я написал для обработки моего сценария?

Расширение моего файла не является .csv, это .lab, но я думаю, что это не проблема?

+0

Какая польза от чтения вторых строк ниже ...? –

+1

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

+0

Если это в системе Linux/UNIX, вы можете использовать такой инструмент, как sed или awk, для выполнения большинства или всей работы. –

ответ

0

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

Предполагая, что тестовый файл (infile), как:

1 
2 
3 
4 
5 

#Adm 
6                                                            
7                                                            

#Prov                                                           
8                                                            
9                                                            

#Adm                                                           
10                                                           
11                                                           

#Prov                                                           
12                                                           
13                                                           

#Adm                                                           
14                                                           
15                                                           

#Prov                                                           
16                                                           
17 

Содержание script.pl:

use warnings; 
use strict; 

## Assign empty value to read file by paragraphs. 
$/ = qq[]; 

## Arrays to save second row of its section. 
my (@adm, @prov); 

## Regex to match beginning of section. 
my $regex = qr/(?:#(?|(Adm)|(Prov)))/; 

## Read file. 
while (<>) { 

    ## Remove last '\n'. 
    chomp; 

    ## If matches the section and it has at least two lines... 
    if (m/\A${regex}/ and tr/\n/\n/ == 2) { 

     ## Group the section name ($1) and its second line ($2). 
     if (m/\A${regex}.*\n^(.*)\Z/ms) { 

      ## Save line in an array depending of section's value. 
      if ($1 eq q[Adm]) { 
       push @adm, $2; 
      } 
      elsif ($1 eq q[Prov]) { 
       push @prov, $2; 
      } 
     } 
    } 
} 

## Print first lines of 'Adm' section and later lines of 'Prov' section. 
for ((@adm, @prov)) { 
    printf qq[%s\n], $_; 
} 

exit 0; 

Выполнить это нравится:

perl script.pl infile 

С следующий вывод:

7 
11 
15 
9 
13 
17 
+0

Спасибо за это. Закончилось писать собственный парсер и использовало некоторые из этого кода. – Fore

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