grabo01
Goto Top

Zeichen per Batch in Textdatei suchen und vergleichen

Hallo zusammen,

ich könnte Hilfe brauchen. Ich möchte in einer Textdatei per Batch eine neue Zeile einfügen. Die Herausforderug ist es, die richtige Zeile zu finden, unter der die neue Zeile eingefügt werden kann.
Z.B. möchte ich einen neuen Account "joshi" anlegen. Ich suche in der vorhandenen Beispieldatei nach Einträgen mit "j", und unter dieser gefundenen Zeile soll eine neue Zeile eingefügt werden.
Hab diese Vorgänge-ähnlich wie beim Struktugramm- einmal zusammen gefasst:

Suche in Zeile 34 und Spalte 75, 76 und 77 jeweils die Zeichen und übergebe jedes in eine Variable
Suche in Zeile 35 und Spalte 75, 76 und 77 jeweils die Zeichen und übergebe jedes in eine Variable
Suche in Zeile 36 und Spalte 75, 76 und 77 jeweils die Zeichen und übergebe jedes in eine Variable
bis Zeile 118
Suche in Zeile 118 und Spalte 75, 76 und 77 jeweils die Zeichen und übergebe jedes in eine Variable

Suche von "neueraccountname" z.B. joshi den ersten Buchstaben (J) und speichere ihn in neue Variable
Suche von "neueraccountname" z.B. joshi den zweiten Buchstaben (o) und speichere ihn in neue Variable
Suche von "neueraccountname" z.B. joshi den dritten Buchstaben (s) und speichere ihn in neue Variable

Vergleiche den ersten Buchstabe von "neueraccountname" z.B. j für joshi mit den Variablen des Suchergebnis
der Zeilen 34 - 118 in der Spalte 75. Suche die Zeile in Spalte 75, wo sich ein "j" befindet.

Szenario 1: Keine Übereinstimmung, es existiert kein Account mit j
Ist der erste Buchstabe von "neueraccountname" (z.B. joshi) in keiner der Zeilen 34-118 in Spalte 75
identisch (wenn z.B. kein Accountname mit "j" beginnt), dann suche die Zeile wo sich der Buchstabe
vor "j" im Alphabet befindet, der vor dem ersten Buchstaben des accounts liegt.
Z.B. "i" liegt im Alphabet vor "j". Suche die Zeile in Spalte 75, wo sich der letzte Eintrag mit "i" befindet.
Dann ist die gesuchte neue Zeile=letzte Eintrag in Zeile mit "i" + 1.

Szenario 2: Eine Übereinstimmung, es existiert bereits ein Account mit J
Ist der erste Buchstabe von "neueraccountname" (z.B. joshi) jedoch in einer der Zeilen 34-118 in Spalte 75
identisch, suche die Zeile wo sich der Buchstabe befindet.
Dann ist die gesuchte neue Zeile=Zeile des Suchergebnisses + 1.

Szenario 3: Zwei Übereinstimmungen, es existiert bereits ein Account mit jo
Vergleiche den ersten und zweiten Buchstaben von "neueraccountname" mit Ergebnis der Zeichensuche aus Spalte 75 und 76.

Suche die
Zeilennummer der Übereinstimmung des ersten und zweiten Buchstabens und geb die Zeilennummer raus.
Dann ist die gesuchte neue Zeile=Zeilennummer + 1.

Szenario 4: Drei Übereinstimmungen, es existiert bereits ein Account mit jos
Vergleiche den ersten, zweiten und dritten Buchstaben von "neueraccountname" (jos) mit Ergebnis der
Zeichensuche aus Spalte 75,76 und 77.

Suche die Zeilennummer der Übereinstimmung des ersten, zweiten und dritten Buchstabens
und geb die Zeilennummer raus. Dann ist die gesuchte neue Zeile=Zeilennummer + 1.


Gibt es per Batch eine Art array wie bei anderen Scriptsprachen?
Danke für deine Hilfe

LG
Dirk

Content-Key: 380442

Url: https://administrator.de/contentid/380442

Ausgedruckt am: 19.03.2024 um 06:03 Uhr

Mitglied: Friemler
Friemler 17.07.2018 aktualisiert um 19:12:33 Uhr
Goto Top
Hallo,

statt solcher Klimmzüge zur Sortierung einer CSV-Datei mit Batchscript zu machen, würde ich Dir empfehlen, Dich mit Excel-VBA bzw. mit der "Fernsteuerung" von Excel per VBScript zu beschäftigen. Batchscript ist zur Verarbeitung von Textdateien nur bedingt geeignet, und wenn eine Textdatei nicht in der Zeichencodierung OEM-850 gespeichert ist (wird in Deinem Fall wohl so sein), sollte man auf jeden Fall die Finger davon lassen.

Excel hat eine eingebaute Sortierfunktion, die sogar drei Spalten beim Sortieren berücksichtigen kann. Zu finden ist das beim Range-Objekt in der Sort-Methode.

Zum Laden der CSV-Datei in Excel musst Du zuerst mit
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = False
eine Excel-Instanz starten und mit
Set objActiveWorkBook = objExcel.WorkBooks.Open("C:\Temp\MeineDatei.csv",,,,,,,,,,,,, True)
die CSV-Datei öffnen. Mit
Set objActiveSheet = objActiveWorkBook.WorkSheets(1)
erhälst Du das aktive Arbeitsblatt. Nachdem Du eine neue Zeile mit den Daten des neuen Benutzers in das Arbeitsblatt eingefügt hast, kannst Du ein Range-Objekt auf dem Arbeitsblatt definieren (s.o.) und dessen Sort-Methode anwenden. Dann noch speichern und mit
objExcel.Quit
Excel schließen - fertig.

Um beim Öffnen der CSV-Datei genauere Vorgaben bzgl. Trennzeichen, Spaltentitel, usw. machen zu können, kann man die Datei auch folgendermaßen laden:
Set objActiveWorkBook = objExcel.WorkBooks.Add(-4167)
Set objActiveSheet    = objActiveWorkBook.WorkSheets(1)

With objActiveSheet.QueryTables.Add("TEXT;C:\Temp\MeineDatei.csv", objActiveSheet.Range("A1"))
  ' Kleine Auswahl der möglichen Parameter

  .FieldNames                   = True    'Erste Zeile enthält Spaltentitel
  .TextFileConsecutiveDelimiter = False   'Aufeinanderfolgende Trennzeichen nicht als ein Trennzeichen behandeln
  .TextFileTabDelimiter         = False
  .TextFileSemicolonDelimiter   = True    'Das Feld-Trennzeichen ist Semikolon
  .TextFileCommaDelimiter       = False
  .TextFileSpaceDelimiter       = False

  ' Datei laden
  Call .Refresh(False)
End With

Grüße
Friemler
Mitglied: grabo01
grabo01 17.07.2018 um 18:43:25 Uhr
Goto Top
Hallo Friemler,

vielen Dank für dein Tip. Ich werde das doch besser mit VB-Script umsetzen. Das ich da nict selbst drauf gekommen bin....