wyrazenia regularne

0

witam
obrabiam wlasnie plik csv, i doszedlem do takiego momentu i mam blokade, mam dane :

285;
;WB;156;2016-06-30;24;2016-06-30;989;  60,00;

JAN KOWALSKI;DZIA�DOWO, Ulica GEN. J�ZEFA HALLERA 23 m.33;

286;
;WB;156;2016-06-30;100;2016-06-30;  68,00;

JAN KOWALSKI;DZIA�DOWO, Ulica GEN. J�ZEFA HALLERA 23 m.33;

287;
;WB;3149;2016-06-30;12;2016-06-30;25039;  51,00;

JAN KOWALSKI;DZIA�DOWO, Ulica GEN. J�ZEFA HALLERA 23 m.33;

sa tu przedstawione 3 wiersza, ale sa rozbite na kilka linii, jak z nich zrobic jakims wyrazeniem zeby kazdy wiersz wygladal tak :

287;;WB;3149;2016-06-30;12;2016-06-30;25039;51,00;JAN KOWALSKI;DZIA�DOWO, HALLERA 23 m.33;
287;;WB;3149;2016-06-30;12;2016-06-30;25039;51,00;JAN KOWALSKI;DZIA�DOWO, HALLERA 23 m.33;

?

chcialbym zamienic znak konca linii np na srednik i zlaczyc wiersze, ale to zlaczy mi
wszystkie w calym pliku...
dzieki za podpowiedzi ;]

0

Po co chcesz to robić? Jaki język

0

potrzebuje to wkleic potem do calca i posortowac i wydrukowac..
do dyspozycji mam linuxa, wyr regularne, nie wiem co tam wiecej ;)

2
 
cat data | grep -v "^[' ']*$" | perl -e '$i=0;while(<>){chomp($_);if($_ =~ /^\d+;/){print "\n$_"}else{;print $_;}}'
0

Wariad: cos nie za bardzo to pokazuje wynik, tak wychodzi:

JAN KOWALSKI;DZIA�DOWO, Ulica NORWIDA 7 ;
JAN KOWALSKI;WARSZAWA 48;10-15; 40,00;
JAN KOWALSKI;WARSAWA, Ulica KSIʯODWORSKA 24;

1

U mnie wygląda to tak:

$ cat data
285;
;WB;156;2016-06-30;24;2016-06-30;989;  60,00;
 
JAN KOWALSKI;DZIA�DOWO, Ulica GEN. J�ZEFA HALLERA 23 m.33;
 
286;
;WB;156;2016-06-30;100;2016-06-30;  68,00;
 
JAN KOWALSKI;DZIA�DOWO, Ulica GEN. J�ZEFA HALLERA 23 m.33;
 
287;
;WB;3149;2016-06-30;12;2016-06-30;25039;  51,00;
      
JAN KOWALSKI;DZIA�DOWO, Ulica GEN. J�ZEFA HALLERA 23 m.33;

$ cat data | grep -v "^[' ']*$" | perl -e 'while(<>){chomp($_);if($_ =~ /^\d+;/){print "\n$_"}else{print $_;}}'

285;;WB;156;2016-06-30;24;2016-06-30;989;  60,00;JAN KOWALSKI;DZIA�DOWO, Ulica GEN. J�ZEFA HALLERA 23 m.33;
286;;WB;156;2016-06-30;100;2016-06-30;  68,00;JAN KOWALSKI;DZIA�DOWO, Ulica GEN. J�ZEFA HALLERA 23 m.33;
287;;WB;3149;2016-06-30;12;2016-06-30;25039;  51,00;JAN KOWALSKI;DZIA�DOWO, Ulica GEN. J�ZEFA HALLERA 23 m.33;
 

Wrzuć gdzieś przykładowy plik, bo tak na copy/paste ze strony to może być ciężko.

0

jest ok, dzieki :)
widze ze trzeba bedzie zaczac ogarniac perla :D
a jeszcze jedno, jak to wkleic w csv zeby sie wpasowalo w kolumny/wiersze ? jak wklejam i rozdzielam separatorem to
wyglada tragicznie

1
$ cat TEST.csv | grep -v "^[[:space:]]*$" | perl -e '$i=0;while(<>){if($i==0){if($_ =~ /^\s*(\d+);\r\n/){print "$1;";$i++;}}elsif($i>=1){$_ =~ /(.*)\r\n/;print $1;if($i==2){print "\r\n";$i=0;}else{$i++;}}}'
1;";;;;;WB;;;197;;;2013-10-15;;148;;;;2013-10-15;;;;;;;;;  48,00;;"JAN KOWALSKI;;;;;;;;;;;WARSZAWA ZACNA 12 M5;;;;;;;;;;;;;;
2;";;;;;WB;;;197;;;2013-10-15;;311;;;;2013-10-15;;;;;;;;;  40,00;;"JAN KOWALSKI;;;;;;;;;;;NAPIWOD 8;;;;;;;;;;;;;;
3;";;;;;WB;;;221;;;2013-11-12;;390;;;;2013-11-12;;;;;;;;;  16,00;;""JAN KOWALSKI;;;;;;;;;;;DZIA?DOWO, Ulica KSI?ODWORSKA 24;;;;;;;;;;;;;;"
4;";;;;;WB;;;223;;;2013-11-14;;235;;;;2013-11-14;;;;;;;;;  30,00;;"JAN KOWALSKI;;;;;;;;;;;NAPIWODA 48;;;;;;;;;;;;;;
5;";;;;;DZ;;;900401;;;2013-12-09;;1;;;;2013-12-09;;;;;;;;;  76,50;;""JAN KOWALSKI;;;;;;;;;;;I?OWO-OSADA, UL WARSZAWSKA m.9;;;;;;;;;;;;;;"
 

Trochę inna wersja, możliwe że jest to związane z końcem wiersza. Spróbuj powyższy przykład, jest tam zakończenie linii : print "\r\n".

0

kurde niby jak to przekieruje do pliku txt to jest ok, ale jak wrzuce do csv - bo zalezy mi zeby to miec w arkuszu to sie wywala calkiem ;/

1
$ cat data | grep -v "^[[:space:]]*$" | perl -e '$i=0;while(<>){if($i==0){if($_ =~ /^\s*(\d+);\n/){print "$1;";$i++;}}elsif($i>=1){$_ =~ /\s*(.*)\n/;print $1;if($i==2){print "\r\n";$i=0;}else{$i++;}}}' | column -s\; -t
285  WB  156   2016-06-30  24   2016-06-30  989        60,00       JAN KOWALSKI                                  DZIA�DOWO, Ulica GEN. J�ZEFA HALLERA 23 m.33  
286  WB  156   2016-06-30  100  2016-06-30    68,00  JAN KOWALSKI  DZIA�DOWO, Ulica GEN. J�ZEFA HALLERA 23 m.33  
287  WB  3149  2016-06-30  12   2016-06-30  25039      51,00       JAN KOWALSKI                                  DZIA�DOWO, Ulica GEN. J�ZEFA HALLERA 23 m.33
 

druga kolumna jest niepoprawna, brakuje jednej danej. Zmieniłem wyrażenie $_ =~ /\s*(.*)\n/. Musisz dopasować to do swoich potrzeb.

0

Trochę spamuję

cat TEST.csv | grep -v "^[[:space:]]*$" | perl -e '$i=0;$/="\r\n";while(<>){chomp($_);if($i==0){if($_ =~ /^\s*(\d+);/){print "$1;";$i++;}}elsif($i>=1){$_ =~ /\s*(.*)/;print $1;if($i==2){print "\r\n";$i=0;}else{$i++;}}}' | column -s\; -t
1  "  WB  197     2013-10-15  148  2013-10-15    48,00  "JAN KOWALSKI   WARSZAWA ZACNA 12 M5              
2  "  WB  197     2013-10-15  311  2013-10-15    40,00  "JAN KOWALSKI   NAPIWOD 8                         
3  "  WB  221     2013-11-12  390  2013-11-12    16,00  ""JAN KOWALSKI  DZIA?DOWO, Ulica KSI?ODWORSKA 24  "
4  "  WB  223     2013-11-14  235  2013-11-14    30,00  "JAN KOWALSKI   NAPIWODA 48                       
5  "  DZ  900401  2013-12-09  1    2013-12-09    76,50  ""JAN KOWALSKI  I?OWO-OSADA, UL WARSZAWSKA m.9    "
 

Wygląda na poprawnie.
$/="\r\n" tutaj zmieniasz rodzaj końca linii.
Aby być pewnym tego że wszystko gra, mógłbyś zrobić mapę wyrażeń i dopasowywać wszystkie zmienne pomiędzy ; do nich, a następnie składać wszystko do kupy. Niestety jest to więcej roboty.

0

a masz jakis pomysl na poprawny eksport do csv ? zeby kazda komorka byla tam gdzie powinna byc ?

1

Powinieneś określić kolumny oraz dane jakie się w nich znajdują. Następnie tworzysz "mapę" wyrażeń regularnych dla każdej kolumny.
Potem sklejone wstępnie wiersze sprawdzasz tymi wyrażeniami, możesz dodatkowo określić ilość błędów w wierszu, a jeżeli błąd to czym ma to wypełnić.
Dużo perl'a, ale wierzę że sobie poradzisz ;)

0

o ja : D no wszystko wygląda dobrze, tylko zostalo mi to poprzerzucac do kolumn, mimo to dziekuje Ci bardzo - sporo roboty

0

a moze daloby rade np powrzucac po jednym sredniku miedzy dane ? mysle ze calc by sobie z tym poradzil

0
$ cat TEST.csv | grep -v "^[[:space:]]*$" | sed -e 's/\ \+/\_/g' | perl -e '$i=0;$/="\r\n";while(<>){chomp($_);if($i==0){if($_ =~ /^\s*(\d+);/){print "$1;";$i++;}}elsif($i>=1){$_ =~ /\s*(.*)/;print $1;if($i==2){print "\r\n";$i=0;}else{$i++;}}}' | column -s\; -t | sed -e 's/\s\+/\;/g' | sed -e 's/\_/\ /g'
1;";WB;197;2013-10-15;148;2013-10-15; 48,00;"JAN KOWALSKI;WARSZAWA ZACNA 12 M5;
2;";WB;197;2013-10-15;311;2013-10-15; 40,00;"JAN KOWALSKI;NAPIWOD 8;
3;";WB;221;2013-11-12;390;2013-11-12; 16,00;""JAN KOWALSKI;DZIA?DOWO, Ulica KSI?ODWORSKA 24;";
4;";WB;223;2013-11-14;235;2013-11-14; 30,00;"JAN KOWALSKI;NAPIWODA 48;
5;";DZ;900401;2013-12-09;1;2013-12-09; 76,50;""JAN KOWALSKI;I?OWO-OSADA, UL WARSZAWSKA m.9;";
 

z tym, że znak "_", nie może znaleźć się w żadnym z danych. Możesz wymienić go na inny w poleceniu sed.
W tej chwili wygląda to tak:

  1. usuń białe wiersze
  2. zamień spacje na pojedynczy znak "_"
  3. wykonaj dopasowanie, umieść w kolumnach
  4. zamień wszystkie białe znaki (powstałe przez stworzenie kolumn) na znak ";"
  5. zamień powrotnie znak _ na spacje

1 użytkowników online, w tym zalogowanych: 0, gości: 1