none
Vereinfachung Import-Script

    Frage

  • Hallo zusammen

    Ich hänge nun seit längerer Zeit an einem kleinen Problem und bekomme es einfach nicht so hin. Das Script funktioniert soweit bestens, es geht nur darum es kürzer zu gestalten (Effektivität und Performance spielen dabei keine Rolle). 

    Auftrag

    Es wird ein Log-File im CSV-Format geliefert, eingelesen und daraus ein *.SQL-File mit den entsprechenden Insert-Kommandos und den Werten erstellt. Das SQL wird danach automatisch in die MySQL-DB eingelesen.

    Log ($csvfile)

    Zeitpunkt Wert1 Wert2 Wert3 Wert4 Wert5 Wert6 Wert7
    01.08.2012 09:00:12 p 120 p 67 p 540 p
    01.08.2012 09:03:24 p 100 p 72 p 540 p
    usw...

    Script:

    # import-csv to variable data $data = import-csv $path\$csvfile -delimiter `t

    # go trough each line in data foreach($line in $data){ "insert into " + $table + " values (`"" + $line.Zeitpunkt + "`", `"" + $line.Wert1 + "`", `"" + $line.Wert2 + "`", `"" + $line.Wert3 + "`", `"" + $line.Wert4 + "`", `"" + $line.Wert5 + "`", `"" + $line.Wert6 + "`", `"" + $line.Wert7 + "`", `"" + $line.Wert8 + "`", `"" + $line.Wert9 + "`", `"" + $line.Wert10 + "`", `"" + $line.Wert11 + "`", `"" + $line.Wert12 + "`", `"" + $line.Wert13 + "`", `"" + $line.Wert14 + "`", `"" + $line.Wert15 + "`", `"" + $line.Wert16 + "`", `"" + $line.Wert17 + "`", `"" + $line.Wert18 + "`", `"" + $line.Wert19 + "`", `"" + $line.Wert20 + "`", `"" + $line.Wert21 + "`", `"" + $line.Wert22 + "`", `"" + $line.Wert23 + "`", `"" + $line.Wert24 + "`", `"" + $line.Wert25 + "`", `"" + $line.Wert26 + "`", `"" + $line.Wert27 + "`", `"" + $line.Wert28 + "`", `"" + $line.Wert29 + "`", `"" + $line.Wert30 + "`", `"" + $line.Wert31 + "`", `"" + $line.Wert32 + "`", `"" + $line.Wert33 + "`", `"" + $line.Wert34 + "`", `"" + $line.Wert35 + "`", `"" + $line.Wert36 + "`");`n" >> $path\$sqlfile }


    Dies klappt bestens. Am Ende erhalte ich meine SQL-Statements:

    insert into table values ("2012-08-01 09:00:12", "p", "120", "p", "67", "p", "540");
    insert into table values ("2012-08-01 09:03:24", "p", "100", "p", "72", "p", "540");
    insert into table values ("2012-08-01 09:06:02", "p", "180", "p", "70", "p", "480");
    insert into table values ("2012-08-01 09:09:09", "p", "100", "p", "67", "p", "580");

    Nun zu meinem Problem. Ich möchte die Zeile "insert into..." verbessern und dynamisch anhand der Anzahl Werte erstellen lassen, am besten in einer for-Schleife...

    foreach($line in $data){
       
       # go trough all elements in line
       for ($i=0; $i -lt 7; $i++) { 
            if ( $i -eq 0 ) { $string = "insert into `"$table`" values (`"$newDate`", `"" } else { $string += "`$line.Wert + $i `" }
      
       }
       
       $string >> $path\$sqlfile
    
    }

    Wenn $i ist gleich 0 soll die Zeile mit "insert into $table values ( $line.Zeitpunkt starten... wenn $i grösser 0, dann die entsprechenden Werte $line.Wert$i eingetragen werden... am besten in einer Zeile... Dies klappt jedoch nicht wie gewünscht.

    Irgendwo ist ein kleiner Denkfehler. Habt Ihr mir einen Tipp?

    Vielen Dank für eure Hilfe.


    • Bearbeitet p3p3_84 Montag, 17. April 2017 11:35
    Montag, 17. April 2017 11:29

Antworten

  • Ich bin nicht so der SQL-Profi, aber ich denke die Erstellung Deiner SQL-Statements kannst Du einfacher und flexibler gestallten:

    $table = 'Tabelle'
    $NoCSV = Get-Content -Path $CSVFile | Select-Object -Skip 1 $SQLStatements = Foreach($line in $NoCSV){ $SQLPartialString = ($line -split '\t' ) -join '", "' "insert into """ + $table + """ values (""$SQLPartialString"");" } $SQLStatements

    ... wenigstens brauchst Du Dir für Dein Script nicht 'n Wolf tippen und die Anzahl der Werte ist nicht mehr von Bedeutung.

    Edit: Noch ein Tipp: Zum Posten von Dateiinhalten, wie z.B. Deine CSV-Daten bietet sich auch das Code-Format an. Dann werden die Zeilenumbrüche im Original erhalten.


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''



    Montag, 17. April 2017 12:42