jabali07
Goto Top

Entferne alle semikolons, die am ende einer zeile stehen (wenn vorhanden)

konnte mein anliegen leider nicht mit den vorhandenen beiträge beheben. drum habe ich mir erlaubt, meine frage zu posten. falls doch schon so etwas behandelt wurde, bin ich für einen link sehr dankbar.

moin,

ich habe mehrere csv-files mit einigen hundert zeilen, die teilweise ein ";" am ende der zeile aufweisen.
leider tritt das völlig unregelmäßig auf: die eine zeile hat ein ";" am ende, die nächste nicht.
ich brauche die csv-files ohne semikolon.

gibt's eventuell eine möglichkeit zu sagen: entferne alle semikolons (wenn vorhanden), die am ende einer zeile stehen ?

das fragt sich... jabali07
Gruß & Danke

Content-Key: 182625

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

Printed on: April 18, 2024 at 00:04 o'clock

Member: MrNetman
MrNetman Mar 26, 2012 at 17:36:58 (UTC)
Goto Top
Hi Jaba,

in Word geht das ganz leicht.
Öffne die Datei mit Word.
suchen und ersetzen - erweitern
Suche nach "';^p" ersetze durch "^p"

läuft.

Gruß
Netman
P.S: würde in Office passen.
Member: bastla
bastla Mar 26, 2012 at 18:18:56 (UTC)
Goto Top
Hallo jabali07!

Etwa so (falls es jeweils nur ein Semikolon am Ende der Zeile geben kann):
@echo off & setlocal
set "Ordner=D:\Der Ordner mit den vielen CSV"  
set "Dateien=*.csv"  

set T=%temp%\CSVTemp.txt
pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b "%Dateien%"') do (  
  move "%%i" %T%  
  (
    for /f "eol=§" %%a in (%T%) do (  
      set "Zeile=%%a"  
      setlocal enabledelayedexpansion
      if "!Zeile:~-1!"==";" (echo(!Zeile:~,-1!) else (echo !Zeile!)  
      endlocal
    )
  )>"%%i"  
)
popd
Mit "§" ist übrigens ein Zeichen gemeint, das nicht in den Dateien vorkommt ...
Falls auch mehrere Semikola am Zeilenende stehen könnten:
@echo off & setlocal
set "Ordner=D:\Der Ordner mit den vielen CSV"  
set "Dateien=*.csv"  

set T=%temp%\CSVTemp.txt
pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b "%Dateien%"') do (  
  move "%%i" %T%  
  for /f "eol=§" %%a in (%T%) do set "Zeile=%%a" & call :ProcessLine "%%i"  
)
popd
goto :eof

:ProcessLine
if not defined Zeile goto :Done
if "%Zeile:~-1%" neq ";" goto :Done  
set "Zeile=%Zeile:~,-1%"  
goto :ProcessLine

:Done
setlocal enabledelayedexpansion
>>%1 echo(!Zeile!
endlocal
goto :eof
Grüße
bastla

[Edit] echo\ durch echo( ersetzt [/Edit]
Mitglied: 64748
64748 Mar 26, 2012 at 22:14:42 (UTC)
Goto Top
Guten Abend,

also für so eine Aufgabe würde ich kein Programm schreiben. Ich nutze auch auf Windowsrechnern den Editor vim, folgendes Kommando kann man in vim verwenden:
:%s/;$//
wenn man die entsprechende Datei geöffnet hat, im einzelnen bedeutet das Kommando % (gesamte Datei), s (ersetze) ;$ (Semikolon am Zeilenende) // (nix)
Falls, wie bastla vermutet, auch mehrere Semikola am Zeilenende stehen können funktioniert auch
:%s/;\+$//

auf einem Linuxrechner geht's natürlich auch mit sed
sed -i "s/;$//" Dateiname
auch hier der allgemeine Fall mit mehreren Semikola am Ende
sed -i "s/;\+$//" Dateiname

Ich hab im Job auch meistens mit Windows zu tun, aber es gibt Dinge, die kann ich mit Unix-Werkzeugen einfacher erledigen. Nix für ungut.

Markus
Member: bastla
bastla Mar 26, 2012 at 22:24:32 (UTC)
Goto Top
Hallo hmarkus!
also für so eine Aufgabe würde ich kein Programm schreiben.
Ich doch auch nicht - ist ja nur ein Stückchen Script (und kommt mit Bordmitteln aus) ... face-wink

Grüße
bastla
Member: jabali07
jabali07 Mar 30, 2012 at 16:24:39 (UTC)
Goto Top
Hallo zusammen,

vielen, lieben Dank für die investierte Zeit.
Für mich IT-Depp ist das wirklich eine super Hilfe.

Ich habe die Vorschläge einmal durchprobiert. (Sogar die Linux-Nummer)

Leider hat das nicht zu dem gewünschten Ergebnissen geführt. Das liegt bestimmt an meinen stümperhaften Beschreibungen.
Ich versuche das noch einmal konkret zu gestalten:

Ausgang: (csv-file mit Inhalt wie folgt)

"Invite";"Invitar";
"OK, thanks!";"¡de acuerdo, gracias!";
"Invite Your Friends";"Invita a tus amigos";
"Custom Message";"Mensaje personalizado";

Gewünschtes Ergebnis: (csv-file mit Inhalt wie folgt)

"Invite";"Invitar"
"OK, thanks!";"¡de acuerdo, gracias!"
"Invite Your Friends";"Invita a tus amigos"
"Custom Message";"Mensaje personalizado"

Also halt genauso wie der Ausgang, nur ohne finales ";"

Wenn ich das Script von baslta laufen lasse, kommt folgendes heraus:

Zeile:~,-1
"OK,
"Invite
"Custom

Gibt's noch eine Idee, wie das funktionieren könnte?

Ein schönes Wochenende an alle
jabali
Mitglied: 64748
64748 Mar 30, 2012 at 17:11:30 (UTC)
Goto Top
Hallo jabali,

ich nehme an, es ist das Skript von bastla was bei Dir nicht richtig funktioniert. Bist Du denn sicher, dass Du es richtig abgetippt (bzw. kopiert hast?).

Poste hier mal bitte das Skript, welches Du benutzt.

Markus
Member: jabali07
jabali07 Mar 30, 2012 at 17:37:40 (UTC)
Goto Top
Hallo Markus,

danke für deine Antwort.
Ich benutze das folgende Script:

@echo off & setlocal

set "Ordner=C:\Folder_01"
set "Dateien=test.csv"
set T=%temp%\CSVTemp.txt
pushd "%Ordner%"

for /f "delims=" %%i in ('dir /b "%Dateien%"') do (

move "%%i" %T%

(

for /f "eol=§" %%a in (%T%) do (

set "Zeile=%%a"

setlocal enabledelayedexpansion

if "!Zeile:~-1!"==";" (echo\!Zeile:~,-1!) else (echo !Zeile!)

endlocal

)

)>"%%i"

)

popd


Das funktioniert auch klasse -ohne Fehlermeldung-, nur ist das Ergebnis nicht ganz, wie gewünscht.

Gruß, jabali
Member: mak-xxl
mak-xxl Mar 30, 2012 at 17:57:50 (UTC)
Goto Top
Moin jabali07,

ich bin gerade über den Beitrag gestolpert und habe die Lösung von bastla vor ein paar Tagen für mich adaptiert, deswegen hier ein Vorschlag:

@echo off & setlocal
set "Ordner=D:\Der Ordner mit den vielen CSV"  
set "Dateien=*.csv"  

set T=%temp%\CSVTemp.txt
pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b "%Dateien%"') do (  
  move "%%i" %T%  
  (
    for /f "delims=" %%a in (%T%) do (  
      set "Zeile=%%a"  
      setlocal enabledelayedexpansion
      if "!Zeile:~-1!"==";" (echo !Zeile:~,-1!) else (echo !Zeile!)  
      endlocal
    )
  )>"%%i"  
)
popd

Beachte bitte Zeilen 10 und 13.

Viel Erfolg, ein schönes Wochenende und freundliche Grüße von der Insel - Mario
Member: jabali07
jabali07 Mar 30, 2012 at 18:32:26 (UTC)
Goto Top
Hallo Mario,

funktioniert 1a! Besten Dank für die Korrektur. Bin glücklich!
Dank auch noch einmal an alle anderen, insbesondere an basla, der mir nicht zum ersten mal ein Superscript zur Verfügung gestellt hat.

Gruß + Gracias
jabali
Member: bastla
bastla Mar 30, 2012 at 20:45:01 (UTC)
Goto Top
Hallo Mario!

"delims=" hätte ich auch schon verwenden sollen ...

Das Weglassen von "eol=§" führt allerdings dazu, dass "for /f" Zeilen, die mit einem Semikolon beginnen, ignoriert (da sie dann defaultmäßig als Kommentar interpretiert werden) ...

Grüße
bastla