Нужно найти и заменить, используя регулярные выражения в Textwrangler - Grep, для файла CSV

StackOverflow https://stackoverflow.com/questions/4586414

  •  14-10-2019
  •  | 
  •  

Вопрос

У меня есть этот файл CSV, простой текст здесь: http://pastie.org/1425970

Как это выглядит в Excel: http://cl.ly/3qxk

Пример того, как я хотел бы, чтобы это выглядело (просто используя первую строку в качестве примера): http://cl.ly/3qyt

Простой текст первого ряда: http://pastie.org/1425979

Мне нужно создать файл CSV, чтобы импортировать всю информацию в таблицу базы данных.

Я мог бы вручную создать CSV, но я хотел посмотреть, возможно ли это сделать, используя регулярные выражения в Textwrangler (GREP) найти и заменить

Это было полезно?

Решение

Регулярные выражения на самом деле не лучший способ сделать это. Как отмечали другие, вам лучше написать какой -то код, чтобы разобрать файл в желаемый формат.

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

Находить:

(\d+),"?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?"?

Заменять:

\1,\2\r\1,\3\r\1,\4\r\1,\5\r\1,\6\r\1,\7\r\1,\8

Который оставит вас с некоторыми дополнительными рядами, как ниже:

1,1
1,8
1,11
1,13
1,
1,
1,
2,10
2,11
2,12
2,
2,
...

Вы можете очистить дополнительные ряды вручную или следующей режимом:

Находить:

\d+,\r

Заменять:

(empty string)

Другие советы

Используя Perl, вы можете сделать что -то вроде этого:

open(my $read,"<","input.csv") or die ("Gah, couldn't read input.csv!\n"); open(my $write,">","output.csv") or die ("WHAAAARGARBL!\n"); while(<$read>) { chomp; if(/(\d+),"(.*)"/) { my @arr=split(/,/,$2); foreach(@arr) { print $write $1.",".$2."\n"; } } } close($read); close($write);

Я не знаю Textmate. Но в целом я могу описать, что нужно, чтобы сделать это в псевдокоде.

loop, read each line  
   strip off the newline
   split into an array using /[, "]+/ as delimeter regex
   loop using result. an array slice from element 1 to the last element
       print element 0, comma, then itterator value
   end loop
end loop

В Perl, что -то подобное ..

while ($line = <DATA> ) {
    chomp $line;
    @data_array = split /[, "]+/, $line;
    for $otherfield ( @data_array[ 1 .. $#data_array ]) {
        print "$data_array[0], $otherfield\n";
    }
}

Это должно быть легко, если у вас есть разделенная возможность.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top