dax4fun
Goto Top

Text formatierung mit mehr als 31 Tokens

Einen schönen guten Morgen wünsche ich,
suche nach einer Lösung für dieses Problem
.csv
 
2014-09-10 00:05:00.0000,2,749497002,1,2,501,2070,4141,2635,3623,2415,1981,301,2548,1621,2229,1485,4294,2760,1302,3513,4831,3220,2576,1656,3312,401,2898,1932,3680,2366,4732,3011,1102,2760,2341,1505,3011,1916,2635,702,"N",2014-09-10 01:55:02.0000  
2014-09-10 00:10:00.....
soll zu formatiert werden
.sql
UPDATE RESULTTABLE set
EVENTTIME='2014-09-10 00:05:00',  
EVENTNUMBER=2,
FIRST=1,
SECOND=2,
GRODD_00=1200,
GRODD_01=1201,
......usw.
GRODD_55=4205,
TRANS_FLAG='N',  
LAST_ACCESS='2014-09-10 01:55:02'  
where EVENTTIME='2014-09-10 00:05:00';  
wie kann ich die Zeichenkette erstellen, da mir bei der for Schleife die Tokens und Laufvariablen ausgehen.

habe leider kein Script da ich zum x mal von neu angefangen hab und immer wieder einen anderen Weg versuchte somit jetzt nur Müll im Ordner
Mit freundlichen Grüßen
dax

Content-ID: 249116

Url: https://administrator.de/forum/text-formatierung-mit-mehr-als-31-tokens-249116.html

Ausgedruckt am: 23.12.2024 um 15:12 Uhr

Lochkartenstanzer
Lochkartenstanzer 13.09.2014 aktualisiert um 09:23:32 Uhr
Goto Top
Zitat von @dax4fun:

2014-09-10 00:05:00.0000,2,749497002,1,2,501,2070,4141,2635,3623,2415,1981,301,2548,1621,2229,1485,4294,2760,1302,3513,4831,3220,2576,1656,3312,401,2898,1932,3680,2366,4732,3011,1102,2760,2341,1505,3011,1916,2635,702,"N",2014-09-10 01:55:02.0000

Sind die Zeilen immer gleich aufgebaut oder variiert die Anzahl der Werte in der Zeile?

wenn ja, dann kann ich Dir (g)awk empfehlen.

Tip:

echo "1,2,3" | gawk -F ","  ' {  print "p1 " $1 "\np2 " $2 "\np3 " $3 "\n" } '

lks

PS: Man kann in gawk-Skripten auch Schleifen bauen, falls die Zeile variabel lang wäre.
colinardo
colinardo 13.09.2014 aktualisiert um 11:45:39 Uhr
Goto Top
Moin,
oder mit Powershell auch kein Hexenwerk. Da deine Quell-CSV nicht so ganz mit deinem gewünschten Output korreliert (z.B. Anzahl der GRODD Werte etc), habe ich es mal an die CSV-Daten angepasst, hoffe die Zuordnung ist OK ?!.
$header = (1..43) -join ","  
$result = @()
$csv = Import-Csv "C:\input.csv" -delimiter "," -Header $header  
$csv | %{
 $result += 'UPDATE RESULTTABLE set'  
 $result += "EVENTTIME='$(($_.1).Split("."))',"  
 $result += "EVENTNUMBER=$($_.2),"  
 $result += "FIRST=$($_.3),"  
 $result += "SECOND=$($_.4),"  
 0..35 | %{
  $result += "GRODD_$(("0$_").Substring(1))=$($_.($_ + 5)),"  
}
$result += "TRANS_FLAG='$($_.42)',"  
$result += "LAST_ACCESS='$(($_.43).Split("."))'"  
 $result += "where EVENTTIME='$(($_.1).Split("."))';"  
}
$result | Set-Content "c:\output.sql"  
ob die Zuordnung der Spalten jetzt so stimmt musst du selber überprüfen.

Grüße Uwe
rubberman
rubberman 13.09.2014 um 14:31:49 Uhr
Goto Top
Hallo.

Mit Batch pur etwa so.
@echo off &setlocal EnableDelayedExpansion
>"C:\output.sql" (  
  for /f "usebackq tokens=1-5* delims=," %%g in ("C:\input.csv") do (  
    echo UPDATE RESULTTABLE set
    for /f "delims=." %%m in ("%%g") do (  
      echo EVENTTIME='%%m',  
      set "eventtime=%%m"  
    )
    echo EVENTNUMBER=%%h,
    echo FIRST=%%j,
    echo SECOND=%%k,
    set "line=%%l"  
    for /l %%m in (100 1 135) do (
      for /f "tokens=1* delims=," %%n in ("!line!") do (  
        set "c=%%m"  
        echo GRODD_!c:~-2!=%%n,
        set "line=%%o"  
      )
    )
    for /f "tokens=1,2 delims=," %%m in ("!line!") do (  
      echo TRANS_FLAG='%%m',  
      for /f "delims=." %%o in ("%%n") do (  
        echo LAST_ACCESS='%%o'  
      )
    )
    echo where EVENTTIME='!eventtime!';  
  )
)
Auch hier vorausgesetzt dass "GRODD_55" ein Schreibfehler war, da dein Beispiel nur 36 Werte beinhaltet.

Grüße
rubberman
dax4fun
dax4fun 13.09.2014 aktualisiert um 18:02:30 Uhr
Goto Top
einen wunderschönen guten Tag,

ja mein Fehler GRODD_55 ist kein Schreibfehler es ist folgendes und es ist xp (powershell ??)
UPDATE RESULTTABLE set
EVENTTIME='2014-09-10 00:05:00',  
EVENTNUMBER=2,
FIRST=1,
SECOND=2,
GRODD_00=1234,
GRODD_01=1342,
GRODD_02=2234,
GRODD_03=1234,
GRODD_04=1234,
GRODD_05=1234,
GRODD_10=1234,
GRODD_11=1234,
GRODD_12=1234,
GRODD_13=1234,
GRODD_14=1234,
GRODD_15=1234,
GRODD_20=1234,
GRODD_21=1234,
GRODD_22=1234,
GRODD_23=1234,
GRODD_24=1234,
GRODD_25=1234,
GRODD_30=1234,
GRODD_31=1234,
GRODD_32=1234,
GRODD_33=1234,
GRODD_34=1234,
GRODD_35=1234,
GRODD_40=1234,
GRODD_41=1234,
GRODD_42=1234,
GRODD_43=1234,
GRODD_44=1234,
GRODD_45=1234,
GRODD_50=1234,
GRODD_51=1234,
GRODD_52=1234,
GRODD_53=1234,
GRODD_54=1234,
GRODD_55=1234,
TRANS_FLAG='N',  
LAST_ACCESS='2014-09-10 01:55:02'  
where EVENTTIME='2014-09-10 00:05:00';  
1234 sind natürlich nur zufällige platzhalter face-smile
ich hab das nicht gepostet da ich dachte es ist ein einfacher Weg wenn z.B. eine Maske aus einer Datei verwendet wird
.csv
2014-09-10 00:10:00.....
maske.txt
UPDATE RESULTTABLE set
EVENTTIME=,
EVENTNUMBER=,
FIRST=,
SECOND=,
.sql
UPDATE RESULTTABLE set
EVENTTIME=2014-09-10 00:10:00,
EVENTNUMBER=2,
FIRST=1,
SECOND=2,...
.csv ---> maske.txt --->.sql

@Lochkartenstanzer
werd ich mir anschauen da ich die csv mit fsql bekomme und dann mit isql wieder einfüge
hab etliche Programme gefunden aber fast bei keinen kann ich ein export wieder importieren als (update).
Mit freundlichen Grüßen
dax
rubberman
Lösung rubberman 13.09.2014 aktualisiert um 20:08:02 Uhr
Goto Top
Hallo dax4fun.

ja mein Fehler GRODD_55 ist kein Schreibfehler es ist folgendes und es ist xp (powershell ??)
Bahnhof ohne Punkt und Komma face-sad

Finden sich denn nun immer 56 Werte in einer Zeile (neben Datum & Co.) oder kann die Anzahl variieren?

Grüße
rubberman
dax4fun
dax4fun 13.09.2014 aktualisiert um 20:13:55 Uhr
Goto Top
@rubberman
tut mir leid, daran sieht man wie ich das handhabe "es wird schon irgendwie gehen" face-smile was fatat ist beim programmieren,

ich hoffe ich werde eine zweite csv auch damit umbasteln können, soll ja auch was davon haben ;)

Danke das erste script hab ich getestet es gibt die GRODD_00 bis 35 aus und schaut gut aus bis auf halt meine fehlende Angabe
UPDATE:
funktioniert super !! hab halt einfach die Schleife für den jeweiligen Bereich mehrfach kopiert
for /l %%m in (105 1 110) do (........................for /l %%m in (110 1 115) do ( usw......
for /f "tokens=1* delims=," %%n in ("!line!") do (
set "c=%%m"
echo GRODD_!c:~-2!=%%n,
set "line=%%o"
)
)

ich sehe jetzt was ich machen würde .....verzweifelt for /l %%m in (00 1 10) do ( herumprobieren face-smile

Danke
dax
colinardo
colinardo 14.09.2014 aktualisiert um 12:30:24 Uhr
Goto Top
Zitat von @dax4fun:
es ist xp (powershell ??)
kein Thema, auch unter XP läuft die Powershell(2.0) face-smile
Windows Management Framework (Windows PowerShell 2.0, WinRM 2.0 und BITS 4.0)

Grüße Uwe