2016-08-16 2 views
0

So zuerst ein Beispiel der tatsächlichen Daten gemangelt (Daten ist ursprünglich eine Mischung aus Text und Zahlen, gibt es keine Bedeutung für die Daten zu diesem Zeitpunkt und einige der Muster sind nur weil ich die meisten Charaktere mit 0s, 1s und Zs, da die Zufallszahlengenerator in meinem Gehirn ersetzt gebrochen):Konvertieren paged Spalten in Zeilen mit einem regulären Ausdrücken

011.0ZN1ZZ     001.F5ZS1Z     001.ZO5ZY0  
014.5ZZZ1Z     001.1SZZOZ     001.ZLMZY0  
016.01NM1SU54    001.EX0Z1Z     001.LIZZOZ  
018.01NM1SS41    001.F83Z1Z     001.0011M1SU54 
014.ZZ1YZZ     001.ZZZ1IZ     001.0011M1SS41 
013.2EBSIZ     001.ZZZ11Z     001.0011SE4 

01N.ZINSIZ     001.ZZZZ1Z     P01.ZZZZ1Z 
01N.01NSE4     001.LSZZHG     N01.ZZZZ1Z  
001.01ON5O     001.5Z21OL     F01.ZZZZ1Z  
001.NE5ZO1     001.ZOM05O     D01.ZZZZ1Z  
001.ZO5ZOZ     001.01NO1G     Z01.ZZZZ1Z  
001.ZO5ZOZ     001.01NO1G     Z01.ZZZZ1Z 

001.011ZOZ     001.01NZ0Y        

Einige weitere Kommentare .. ich Leerzeichen aufzuräumen und mit Satzlänge ohne Probleme umgehen Daher möchte ich die Frage vereinfachen. Ich füge nur das oben Genannte hinzu, falls es eine Lösung für die vereinfachte Version gibt, die nicht einfach auf eine komplexere Version erweitert werden kann.

1 7 13 
2 8 14 
3 9 15 
4 10 16 
5 11 17 
6 12 18 

19 25 
20 26 
21 27 
22 28 
23 29 
24 

So eine variable Anzahl von Seiten, aber die gleiche Anzahl von Spalten und Zeilen wird auf jeder Seite gibt es (obwohl, falls es wesentlich ankommt, ist es eigentlich 12x3 statt 6x3, aber ich wollte es einfach halten wenn möglich), obwohl die letzte Seite einige leere Zeilen/Spalten sein kann.

Ich benutze Notepad ++, aber ich habe Zugang zu verschiedenen Gnutilities, also wenn es eine Lösung gibt, die viel besser ist als ein regulärer Ausdruck, stört mich das nicht, obwohl ich das viel benutzen werde und notizbuch ++ a benutze viel Ich würde eine Regex-Lösung schätzen, wenn es nicht zu verrückt ist.

Antwort

0

Wenn Sie Git auf Ihrem Windows-Computer installiert haben, können Sie Perl von Git bash verwenden. Vorausgesetzt, Ihre Eingabedatei data benannt ist, versuchen Sie den folgenden Befehl (Vorsicht: es wird die Eingabedatei orverwrite):

echo >>data ; \ 
perl -i -lane' 
    $i=0; 
    push @{$c[$i++]}, $_ foreach @F; 
    if (/^\s*$/) { 
     push @l, @{$_} foreach @c; 
     print "@l\015"; 
     @[email protected]=(); 
    }' data 

Die Perl-Befehl behandelt jede Zeile der Eingabe als Raum getrennte Felder und reichert sich die Felder in der @c Matrix. Wenn eine leere Zeile gefunden wird (if (/^\s*$/) ...), werden die in einer Liste verketteten Matrixspalten gedruckt.

Die Eingabedatei wird direkt geändert. Eine Sicherungskopie data.bak wird erstellt.

Die Eingabedatei darf nicht mit einer leeren Zeile enden, daher füge ich eine mit echo >>data hinzu. Dies macht das Perl-Skript kürzer und einfacher.

Ein weiterer Trick ist die nachlaufende \015 in print "@l\015";. Dies ermöglicht es uns, Windows CRLF-Zeilenenden in einer Unix-artigen Git-bash-Umgebung zu erhalten.

Eine Demo finden Sie hier: https://ideone.com/vnYoOd. Aber da Ideone das Lesen/Schreiben von Dateien verbietet, wurde der ursprüngliche Befehl geändert, um den Code dort laufen zu lassen.

+0

Danke .. Dies tut nicht genau das, was ich will, wie ich es mir vorgestellt habe, aber es erfüllt die Anforderungen, die ich angegeben habe, und ich verstehe es gut genug, um es zu zwicken. Sobald ich Zeit dazu habe, füge ich einen weiteren Kommentar mit dem Code hinzu, den ich tatsächlich benutzt habe. Die einzige wirkliche Korrektur, die ich hier machen würde, ist: print "@l \ 012 \ 015"; obwohl ehrlich von dem, was ich dir sagen kann, kann einfach \ r \ n und es erzeugt das gleiche Ergebnis, aber ich nehme an, 012 015 ist wahrscheinlich besser, falls ein Dolmetscher \ r und \ n anders behandelt (wenn das nicht Standard ist) würde ich liebe immer noch eine Regex-Lösung, aber wenn/bis ich eine bekomme, habe ich dies als die Lösung markiert – Mark

Verwandte Themen