none
Grosse txt-Datei durchscannen und dabei Werte überprüfen RRS feed

  • Frage

  • Hallo Zusammen,

    Habe bisher nur Anonym mitgelesen, nun benötigte ich aber eure Hilfe.

    Wir haben eine *.txt Datei welche 150MB gross ist - ähnlich aufgebaut wie eine *.csv-Datei

    Nr             Code
    19010554  6408050
    19010764  6408297
    10453350   353141

    Bei der letzten Zeile, sieht man, dass bei "Code" nur 6 Zeichen bzw. Ziffern stehen. Nun benötigen wir eine automatisierung, in Form eines Scripts welche bei jeder Zeile überprüft, ob dort 6 oder 7 Ziffern sind und allenfalls eine 0 vorne anhängt:

    Nr             Code
    19010554  6408050
    19010764  6408297
    10453350  0353141

    Das Txt-File hat noch weitere Spalten, die aber nicht wichtig sind.

    Könnt ihr mir hier weiterhelfen?

    Besten Dank im Voraus

    David



    • Bearbeitet DavidR96 Freitag, 1. April 2016 11:36
    Freitag, 1. April 2016 11:36

Antworten

  •  

    Ich würde das auch Zeilenweise angehen, mit einem Streamreader/writer:

    $Sourcefile = "D:\myfile.txt"
    $targetfile = "D:\myfile-edited.txt"
    
    $reader = new-object System.IO.StreamReader $Sourcefile
    $writer = new-object System.IO.StreamWriter $targetfile
    do {
            $line = $reader.ReadLine()
            $line = $line -replace '(\b[0-9]{6}\b)', '0$1'
    	$writer.WriteLine($line)
        }
    while (!($reader.EndOfStream)) 
    
    $reader.Close()
    $writer.close()

     
    Der skaliert problemlos und ist schön flott, macht bei mir ein 130MB Testfile in 9 Sekunden.
    Was die Ersetzung der Zahlen betrifft:
    Insofern 6-Stellige Zahlen wirklich nur in der zu bearbeitenden Spalte vorkommen, kannst du zum ersetzen Davids Methode nutzen.

    Wenn das aber nicht so ist, müsste man die Suche der zu ersetzenden Zahl anders angehen.  (Dann wäre mal interessant zu wissen, welches Trennzeichen in der Originaldatei zwischen den einzelnen "Spalten" ist, also z.B. ein Tab oder 6 Leerzeichen etc.)
     
    Grüße, Denniver

     

    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 6. April 2016 19:53
    Moderator

Alle Antworten

  • Poste mal ein paar komplette Zeilen der Datei, mit allen Spalten.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Samstag, 2. April 2016 21:13
    Moderator
  • Hi Denniver Reining,

    Sorry für die späte Antwort - hier die gewünschten Spalten.

    13256630  2422277     8711428082548 "name der datei"    Z       S            19011920       E10           27.00         27.00         13.99          0.00          0.00          0.00         14.26         14.26          0.00       42.96       75.32          0.00          0.00          0.00        1    8.00 "A"        ""         ""         ""                0             0                 0                                               0               GHS                                       0        0                                  0        0                                  0        0        0        0               102778               3M (TEST) SA              3453        3M (TEST) SASA (PROFES                                                      Stk                     0.00                 13.99                11.93                0.00                 11.93                0.00                 0.00                 0.00                 0.00                 0.00
    18374292  5863450                 0 "name der datei"    Z       S            19011920       E10            0.00          0.00          0.00          0.00          0.00          0.00          0.00          0.00          0.00        0.00        0.00          0.00          0.00          0.00        1    8.00 ""         ""         ""         ""                0             0                 0                                               0                                                         0        0                                  0        0                                  0        0        0        0               102778               3M (TEST) SA              3453        3M (TEST) SASA (PROFES                                                      Stk                     0.00                 0.00                 0.00                 0.00                 0.00                 0.00                 0.00                 0.00                 0.00                 0.00
    10485546   766239                 0 "name der datei"       Z       S            19011906       E10           92.10         92.10         52.11          0.00          0.00          0.00          0.00          0.00          0.00        0.00        0.00          0.00          0.00          0.00        1    8.00 ""         ""         ""         ""                0             0                 0                                               0               g                                         0        0                                  0        0                                  0        0        0        0               102778               3M (TEST) SA              3453        3M (TEST) SASA (PROFES                                                      Stk                     0.00                 52.11                0.00                 0.00                 0.00                 0.00                 0.00                 0.00                 0.00                 0.00
    10485515   766191                 0 "name der datei"       Z       S            19011906       E10           82.75         82.75         52.17          0.00          0.00          0.00         52.62         52.62          0.00       31.32       45.61          0.00          0.00          0.00        1    8.00 "A"        ""         ""         ""                0             0                 0                                               0               gh       SIXELAG TX                       0        0                                  0        0                                  0        0        0        0               102778               3M (TEST) SA              3453        3M (TEST) SASA (PROFES                                                      Stk                     0.00                 52.17                49.87                0.00                 0.00                 0.00                 0.00                 0.00                 0.00                 0.00
    10485520   766216                 0 "name der datei"        Z       S            19011906       E10           92.10         92.10         52.17          0.00          0.00          0.00         52.62         52.62          0.00       38.30       62.06          0.00          0.00          0.00        1    8.00 "A"        ""         ""         ""                0             0                 0                                               0               GH       SIXELAG TX                       0        0                                  0        0                                  0        0        0        0               102778               3M (TEST) SA              3453        3M (TEST) SASA (PROFES                                                      Stk                     0.00                 52.17                49.87                0.00                 0.00                 0.00                 0.00                 0.00                 0.00                 0.00

    LG


    Mittwoch, 6. April 2016 06:44
  • Hi David,

    eine Möglichkeit wäre die gesamte Textdatei zu laden und alle Zeichenketten mit 6 Zahlen durch eine vorangestellte 0 zu ersetzen:

    $content = Get-Content C:\Temp\test.txt
    $newContent = $content -replace '(\b[0-9]{6}\b)', '0$1'

    Das geht jedoch nur, wenn auch alle Zeichenketten mit 6 Zahlen verändert werden müssen.

    Ist in der Textdatei zwischen jeder Spalte ->ein<- Leerzeichen? (dann könnte man es mit Import-CSV laden)

    Wenn das auch nicht geht, müsstest du das RegEx erweitern, dass er nur die Werte an der richtigen Stelle per Line austauscht. Das Gute ist ja, dass jede Line gleich aufgebaut ist.

    Hoffe das hilft etwas.


    Best regards,

    David das Neves
    Premier Field Engineer



    Please vote as helpful and mark as answer if a post helped you.
    This posting is provided "AS IS" with no warranties and confers no rights.

    Mittwoch, 6. April 2016 15:12
  • > eine Möglichkeit wäre die gesamte Textdatei zu laden und alle
     
    Es geht um eine _grosse_ Textdatei... Zeilenweise wäre also zu empfehlen.
     


    • Bearbeitet Denniver ReiningMVP, Moderator Mittwoch, 6. April 2016 18:50 Der Beruf oder die Qualifikation der Teilnehmer sollten nicht Gegenstand der Diskussion sein.
    Mittwoch, 6. April 2016 16:14
  •  

    Ich würde das auch Zeilenweise angehen, mit einem Streamreader/writer:

    $Sourcefile = "D:\myfile.txt"
    $targetfile = "D:\myfile-edited.txt"
    
    $reader = new-object System.IO.StreamReader $Sourcefile
    $writer = new-object System.IO.StreamWriter $targetfile
    do {
            $line = $reader.ReadLine()
            $line = $line -replace '(\b[0-9]{6}\b)', '0$1'
    	$writer.WriteLine($line)
        }
    while (!($reader.EndOfStream)) 
    
    $reader.Close()
    $writer.close()

     
    Der skaliert problemlos und ist schön flott, macht bei mir ein 130MB Testfile in 9 Sekunden.
    Was die Ersetzung der Zahlen betrifft:
    Insofern 6-Stellige Zahlen wirklich nur in der zu bearbeitenden Spalte vorkommen, kannst du zum ersetzen Davids Methode nutzen.

    Wenn das aber nicht so ist, müsste man die Suche der zu ersetzenden Zahl anders angehen.  (Dann wäre mal interessant zu wissen, welches Trennzeichen in der Originaldatei zwischen den einzelnen "Spalten" ist, also z.B. ein Tab oder 6 Leerzeichen etc.)
     
    Grüße, Denniver

     

    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 6. April 2016 19:53
    Moderator
  • Jap das stimmt - hatte das mit der großen Datei beim Überfliegen überlesen.


    Best regards,

    David das Neves
    Premier Field Engineer



    Please vote as helpful and mark as answer if a post helped you.
    This posting is provided "AS IS" with no warranties and confers no rights.

    Donnerstag, 7. April 2016 17:32