Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

CSV Datei per Batch erweitern

Frage Entwicklung Batch & Shell

Mitglied: christiankarl

christiankarl (Level 1) - Jetzt verbinden

07.05.2013, aktualisiert 09.05.2013, 2211 Aufrufe, 18 Kommentare

Hallo an das Forum, vielleicht kann mir einer von Euch weiterhelfen.

Ich habe eine CSV Datei mit ";" getrennten Zeichen

Diese hat u.a. folgenden "Spaltenüberschriften"
Service & ISBNNummer 
 
Test;Test2;Test3;.....;Service;...;Test20;ISBNNummer;Test23 
2;aaa;123;.....;C22222;...;11111;10000;Test23 
3;bbb;456;.....;C33333;...;22222;20000;Test23
Nun möchte ich erreichen, dass eine weitere Spalte hinzugefügt wird "Steuersatz"
Test;Test2;Test3;.....;Service;...;Test20;ISBNNummer;Test23;Steuersatz
darunter sollen die Werte aus Service & ISBNNummer zusammengefasst werden, getrennt mit einem "-"
Test;Test2;Test3;.....;Service;...;Test20;ISBNNummer;Test23;Steuersatz 
2;aaa;123;.....;C22222;...;11111;10000;Test23;C22222-10000 
3;bbb;456;.....;C33333;...;22222;20000;Test23;C33333-20000
manuell in Excel ist dieses für mich kein Problem, nur soll dieses per VBS Script oder Batch laufen
ohne das ein anderes Problem noch manuell eingegriffen werden muss.

Ich kenne mich in der Programmierung nicht aus, vielleicht kann mir hier jemand helfen.

Schönen Gruß
Mitglied: bastla
07.05.2013 um 20:37 Uhr
Hallo christiankarl und willkommen im Forum!

Grundsätzlich sollte das mit einem VBScript keine große Sache sein - allerdings bräuchte ich dazu eine Satzbeschreibung (bzw zumindest die Spaltennummern der beiden relvanten Felder - diese werden ja wohl immer gleich bleiben) ...

Grüße
bastla
Bitte warten ..
Mitglied: rubberman
07.05.2013 um 23:29 Uhr
Hallo christiankarl, willkommen im Forum.

Wie bastla schon angemerkt hat, ist das recht gut per VBScript zu lösen.

*.vbs
01.
Option Explicit 
02.
 
03.
Const strCSVPath = "test.csv" 
04.
Const strColSrv  = "Service" 
05.
Const strColISBN = "ISBNNummer" 
06.
Const strColNew  = "Steuersatz" 
07.
 
08.
Const ForReading = 1 
09.
Const ForWriting = 2 
10.
 
11.
Dim objFSO, objFile, objStream, aLine, i, idxService, idxISBN, sNewContent 
12.
 
13.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
14.
If objFSO.FileExists(strCSVPath) Then 
15.
  Set objFile = objFSO.GetFile(strCSVPath) 
16.
  If objFile.Size > 0 Then 
17.
    Set objStream = objFile.OpenAsTextStream(ForReading) 
18.
    aLine = Split(objStream.ReadLine, ";") 
19.
    If UBound(aLine) = -1 Then 
20.
      MsgBox "Die CSV Datei beginnt mit einer Leerzeile.", vbCritical Or vbSystemModal, "Fehler" 
21.
      WScript.Quit 
22.
    End If 
23.
    If aLine(UBound(aLine)) <> strColNew Then 
24.
      idxService = -1 
25.
      idxISBN = -1 
26.
      For i = 0 To UBound(aLine) 
27.
        If aLine(i) = strColSrv Then idxService = i 
28.
        If aLine(i) = strColISBN Then idxISBN = i 
29.
      Next 
30.
      If idxService > -1 And idxISBN > -1 Then 
31.
        sNewContent = Join(aLine, ";") & ";" & strColNew 
32.
        While Not objStream.AtEndOfStream 
33.
          aLine = Split(objStream.ReadLine, ";") 
34.
          If UBound(aLine) = i - 1 Then 
35.
            sNewContent = sNewContent & vbNewLine & Join(aLine, ";") & ";" & aLine(idxService) & "-" & aLine(idxISBN) 
36.
          Else 
37.
            MsgBox "Zeile mit Anzahl Elementen ungleich Überschrift gefunden.", vbCritical Or vbSystemModal, "Fehler" 
38.
            WScript.Quit 
39.
          End If 
40.
        Wend 
41.
        objStream.Close 
42.
        Set objStream = objFile.OpenAsTextStream(ForWriting) 
43.
        objStream.Write sNewContent 
44.
        objStream.Close 
45.
      Else 
46.
        MsgBox "Überschrift """ & strColSrv & """ und/oder """ & strColISBN & """ nicht gefunden.", vbCritical Or vbSystemModal, "Fehler" 
47.
        WScript.Quit 
48.
      End If 
49.
    Else 
50.
      MsgBox "Überschrift """ & strColNew & """ existiert bereits.", vbCritical Or vbSystemModal, "Fehler" 
51.
      WScript.Quit 
52.
    End If 
53.
  Else 
54.
    MsgBox "Die CSV Datei hat keinen Inhalt.", vbCritical Or vbSystemModal, "Fehler" 
55.
    WScript.Quit 
56.
  End If 
57.
Else 
58.
  MsgBox "Die CSV Datei konnte nicht gefunden werden.", vbCritical Or vbSystemModal, "Fehler" 
59.
  WScript.Quit 
60.
End If
Grüße
rubberman
Bitte warten ..
Mitglied: bastla
07.05.2013, aktualisiert um 23:40 Uhr
Hallo rubberman!

Dass Du gleich die Luxus-Variante auspackst ...

Falls das Script auch unattended verwendet werden soll, wäre "WScript.Echo" anstelle von "MsgBox" vorteilhaft, und dann würde ich den jeweiligen Fehler auch durch
WScript.Quit <Fehlernummer>
als Errorlevel zurückgeben ...

Grüße
bastla
Bitte warten ..
Mitglied: christiankarl
08.05.2013, aktualisiert um 09:08 Uhr
Hallo rubberman, Hallo Bastla,

vielen Dank für die Rückmeldung und für das deutlich und ausführliche Script.
Trotz, dass in der ersten Zeile die Werte Service & ISBNNummer vorhanden
und darunterliegende Werte alle gefüllt sind erscheint der Hinweis

"Zeile mit Anzahl Elementen ungleich Überschrift gefunden"

Vielleicht kann hier nochmal jemand drüber schauen

Danke schön, Christian
Bitte warten ..
Mitglied: 76109
08.05.2013, aktualisiert um 11:03 Uhr
Hallo christiankarl!

Das soll heißen, dass die CSV-Datei eine (oder mehrere) Zeilen enthält, in denen die Anzahl der Trennzeichen (;) nicht mit der Anzahl Trennzeichen in der Überschriftzeile übereinstimmt... Kann sich aber auch um eine Leerzeile (vermutlich am Dateiende) handeln ?

Ersetze mal Codezeile 36 (Else) durch:
01.
ElseIf UBound(aLine) > -1 Then 
Dadurch werden Leerzeilen ignoriert...

Gruß Dieter
Bitte warten ..
Mitglied: christiankarl
08.05.2013 um 11:29 Uhr
Hallo Dieter,

vielen Dank für den Hinweis,
genau das war es gewesen, hier war eine Leerzeile am ende mit enthalten gewesen.

Gruß
Christian
Bitte warten ..
Mitglied: christiankarl
08.05.2013, aktualisiert um 13:35 Uhr
Hallo,
ich hatte zu diesem Problem ein weiteres aufgemacht,
auf Anraten sollte ich die Frage aber hier mit einfügen

in der CSV Datei stehen an unterschiedlichen Stellen Wörter mit APP@

Test;STOAPP@DE1234;
Test2;CAROAPP@DE748;
Test3;MARIAPP@KU1234;
ect.

Nun möchte ich erreichen, dass die gesamte Datei durchsucht wird und sobald der String APP@ vorhanden ist, dieser vor dem Wert APP alles stehen lässt

Test;STO;
Test2;CAR;
Test3;MAR;
ect.

Kann hier bestehendes Skript noch erweitert werden?

Gruß
Christian
Bitte warten ..
Mitglied: bastla
08.05.2013 um 15:48 Uhr
Hallo christiankarl!

Ungetesteter Ansatz: Füge nach Zeile 6
01.
Const strDelim = "APP@"
und zwischen Zeile 34 und 35
01.
For j = 0 To UBound(aLine) 
02.
    iPos = InStr(aLine(j), strDelim) 
03.
    If iPos > 0 Then aLine(j) = Left(aLine(j), iPos - 1) 
04.
Next
ein.

Grüße
bastla
Bitte warten ..
Mitglied: christiankarl
08.05.2013 um 16:13 Uhr
Hallo Bastla,

ich habe deinen Ansatz eingebunden,
leider ändert er die Werte nicht ab

01.
Option Explicit 
02.
 
03.
Const strCSVPath = "global.csv" 
04.
Const strColSrv  = "Service" 
05.
Const strColISBN = "ISBNNummer" 
06.
Const strColNew  = "ref" 
07.
Const strDelim   = "app@" 
08.
 
09.
Const ForReading = 1 
10.
Const ForWriting = 2 
11.
 
12.
Dim objFSO, objFile, objStream, aLine, i, idxService, idxISBN, sNewContent, j, iPos 
13.
 
14.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
15.
If objFSO.FileExists(strCSVPath) Then 
16.
  Set objFile = objFSO.GetFile(strCSVPath) 
17.
  If objFile.Size > 0 Then 
18.
    Set objStream = objFile.OpenAsTextStream(ForReading) 
19.
    aLine = Split(objStream.ReadLine, ";") 
20.
    If UBound(aLine) = -1 Then 
21.
      MsgBox "Die CSV Datei beginnt mit einer Leerzeile.", vbCritical Or vbSystemModal, "Fehler" 
22.
      WScript.Quit 
23.
    End If 
24.
    If aLine(UBound(aLine)) <> strColNew Then 
25.
      idxService = -1 
26.
      idxISBN = -1 
27.
      For i = 0 To UBound(aLine) 
28.
        If aLine(i) = strColSrv Then idxService = i 
29.
        If aLine(i) = strColISBN Then idxISBN = i 
30.
      Next 
31.
      If idxService > -1 And idxISBN > -1 Then 
32.
        sNewContent = Join(aLine, ";") & ";" & strColNew 
33.
        While Not objStream.AtEndOfStream 
34.
        For j = 0 To UBound(aLine) 
35.
            iPos = InStr(aLine(j), strDelim) 
36.
            If IPos > 0 Then aLine(j) = Left(aLine(j), iPos -1) 
37.
        next 
38.
        aLine = Split(objStream.ReadLine, ";") 
39.
          If UBound(aLine) = i - 1 Then 
40.
            sNewContent = sNewContent & vbNewLine & Join(aLine, ";") & ";" & aLine(idxService) & aLine(idxISBN) 
41.
          ElseIf UBound(aLine) > -1 Then  
42.
            MsgBox "Zeile mit Anzahl Elementen ungleich Überschrift gefunden.", vbCritical Or vbSystemModal, "Fehler" 
43.
            WScript.Quit 
44.
          End If 
45.
        Wend 
46.
        objStream.Close 
47.
        Set objStream = objFile.OpenAsTextStream(ForWriting) 
48.
        objStream.Write sNewContent 
49.
        objStream.Close 
50.
      Else 
51.
        MsgBox "Überschrift """ & strColSrv & """ und/oder """ & strColISBN & """ nicht gefunden.", vbCritical Or vbSystemModal, "Fehler" 
52.
        WScript.Quit 
53.
      End If 
54.
    Else 
55.
      MsgBox "Überschrift """ & strColNew & """ existiert bereits.", vbCritical Or vbSystemModal, "Fehler" 
56.
      WScript.Quit 
57.
    End If 
58.
  Else 
59.
    MsgBox "Die CSV Datei hat keinen Inhalt.", vbCritical Or vbSystemModal, "Fehler" 
60.
    WScript.Quit 
61.
  End If 
62.
Else 
63.
  MsgBox "Die CSV Datei konnte nicht gefunden werden.", vbCritical Or vbSystemModal, "Fehler" 
64.
  WScript.Quit 
65.
End If 
66.
 
Kannst du hier nochmal drüberschauen?
Vielen Dank für die vielen Hilfen.

Gruß
Christian
Bitte warten ..
Mitglied: bastla
08.05.2013 um 16:32 Uhr
Hallo christiankarl!

Der zweite Codeteil sollte nach der ursprünglichen Zeile 34, also
If UBound(aLine) = i - 1 Then
rein ...

Damit sowohl "app@" als auch "APP@" erkannt werden, verwende
iPos = InStr(1, aLine(j), strDelim, vbTextCompare)
als Ersatz meiner Zeile 2 von oben ...

Grüße
bastla
Bitte warten ..
Mitglied: christiankarl
08.05.2013, aktualisiert um 16:56 Uhr
Hallo Bastla;

Danke nochmal für die Rückmeldung.

Beim weiteren Ausführen erscheint nun ein Windows Script Host Error

Zeile 37
Zeichen 9
Fehler Typen unverträglich. '[STRING. "cad"]"
Code 800A000D

Der Wert cad steht in der 2 Zeile der CSV Datei, direkt als erster Wert.
Der Wert mit "app@" kommt erst in den anderen Bereichen,
vielleicht hilft der Hinweis: Der zu korrigierende Wert "app@" ist im Bereich mit der Überschrift "KBANT" zu finden

Gruß
Christian
Bitte warten ..
Mitglied: bastla
08.05.2013 um 16:57 Uhr
Hallo christiankarl!

Was steht denn in der Zeile 37?

Grüße
bastla
Bitte warten ..
Mitglied: christiankarl
08.05.2013 um 17:09 Uhr
Anbei Codezeile 35 - 39

01.
35          If UBound(aLine) = i - 1 Then 
02.
36		  For j = 0 To UBound(aLine) 
03.
37              iPos = InStr(1, aLine(j), strDelim, vbTextCompare) 
04.
39              If iPos > 0 Then aLine(j) = Left(aLine(j), iPos - 1) 
05.
40      Next
Gruß
Christian
Bitte warten ..
Mitglied: bastla
08.05.2013 um 17:42 Uhr
Hallo christiankarl!

Mit Deinen oben ansatzweise geposteten Testdaten (ergänzt um Einträge der Art "STOAPP@DE1234") und dieser Script-Version
01.
Option Explicit 
02.
 
03.
Const strCSVPath = "global.csv" 
04.
Const strColSrv  = "Service" 
05.
Const strColISBN = "ISBNNummer" 
06.
Const strColNew  = "ref" 
07.
Const strDelim   = "app@" 
08.
 
09.
Const ForReading = 1 
10.
Const ForWriting = 2 
11.
 
12.
Dim objFSO, objFile, objStream, aLine, i, idxService, idxISBN, sNewContent, j, iPos 
13.
 
14.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
15.
If objFSO.FileExists(strCSVPath) Then 
16.
  Set objFile = objFSO.GetFile(strCSVPath) 
17.
  If objFile.Size > 0 Then 
18.
    Set objStream = objFile.OpenAsTextStream(ForReading) 
19.
    aLine = Split(objStream.ReadLine, ";") 
20.
    If UBound(aLine) = -1 Then 
21.
      MsgBox "Die CSV Datei beginnt mit einer Leerzeile.", vbCritical Or vbSystemModal, "Fehler" 
22.
      WScript.Quit 
23.
    End If 
24.
    If aLine(UBound(aLine)) <> strColNew Then 
25.
      idxService = -1 
26.
      idxISBN = -1 
27.
      For i = 0 To UBound(aLine) 
28.
        If aLine(i) = strColSrv Then idxService = i 
29.
        If aLine(i) = strColISBN Then idxISBN = i 
30.
      Next 
31.
      If idxService > -1 And idxISBN > -1 Then 
32.
        sNewContent = Join(aLine, ";") & ";" & strColNew 
33.
        While Not objStream.AtEndOfStream 
34.
          aLine = Split(objStream.ReadLine, ";") 
35.
          If UBound(aLine) = i - 1 Then 
36.
            For j = 0 To UBound(aLine) 
37.
              iPos = InStr(1, aLine(j), strDelim, vbTextCompare) 
38.
              If IPos > 0 Then aLine(j) = Left(aLine(j), iPos -1) 
39.
            Next 
40.
            sNewContent = sNewContent & vbNewLine & Join(aLine, ";") & ";" & aLine(idxService) & aLine(idxISBN) 
41.
          ElseIf UBound(aLine) > -1 Then  
42.
            MsgBox "Zeile mit Anzahl Elementen ungleich Überschrift gefunden.", vbCritical Or vbSystemModal, "Fehler" 
43.
            WScript.Quit 
44.
          End If 
45.
        Wend 
46.
        objStream.Close 
47.
        Set objStream = objFile.OpenAsTextStream(ForWriting) 
48.
        objStream.Write sNewContent 
49.
        objStream.Close 
50.
      Else 
51.
        MsgBox "Überschrift """ & strColSrv & """ und/oder """ & strColISBN & """ nicht gefunden.", vbCritical Or vbSystemModal, "Fehler" 
52.
        WScript.Quit 
53.
      End If 
54.
    Else 
55.
      MsgBox "Überschrift """ & strColNew & """ existiert bereits.", vbCritical Or vbSystemModal, "Fehler" 
56.
      WScript.Quit 
57.
    End If 
58.
  Else 
59.
    MsgBox "Die CSV Datei hat keinen Inhalt.", vbCritical Or vbSystemModal, "Fehler" 
60.
    WScript.Quit 
61.
  End If 
62.
Else 
63.
  MsgBox "Die CSV Datei konnte nicht gefunden werden.", vbCritical Or vbSystemModal, "Fehler" 
64.
  WScript.Quit 
65.
End If
läuft das bei mir fehlerfrei (und erfolgeich) ...

Sollte der Fehler bei Dir weiterhin auftreten, poste bitte Deine "global.csv" (auf die relevanten Zeilen reduziert und ggf anonymisiert) in "Code"-Formatierung.

Grüße
bastla
Bitte warten ..
Mitglied: christiankarl
09.05.2013 um 10:21 Uhr
Hallo Bastla,

vielen dank für die Rückmeldung.
komisch, nun geht's bei mir auch.
Ich danke dir für die hilfreiche Unterstützung.

wünsche ein schönen Feiertag
Bitte warten ..
Mitglied: rubberman
10.05.2013 um 13:00 Uhr
[OT]
@ bastla und Dieter

Danke für die (Kurz-)Urlaubsvertretung. Ist normalerweise nicht meine Art ein Stück Code in die Welt zu werfen und mich dann nicht mehr darum zu kümmern ...

Grüße
rubberman
[/OT]
Bitte warten ..
Mitglied: bastla
10.05.2013 um 13:25 Uhr
Hallo rubberman!

Aber gerne - wenn's Dich nicht stört, dass ich an Deinem Code rumpfusche ...

Grüße
bastla
Bitte warten ..
Mitglied: 76109
11.05.2013 um 00:10 Uhr
Hallo rubberman!

Ebenfalls gerne

Bin ja auch froh, wenn ich Unterstützung bekomme und habe auch grundsätzlich nichts dagegen, wenn ihr in meinen Codes rumpfuscht

Gruß Dieter
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

VB for Applications
Bestimmte Daten aus eine CSV-Datei in eine Excel-Tabelle importieren (2)

Frage von MariaElena zum Thema VB for Applications ...

Batch & Shell
gelöst PS Werte CSV-Datei in AD Attribut (3)

Frage von lupolo zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...