intermde
Goto Top

Aus allen TXT Dateien eines Verzeichnisses die erste Zeile entfernen

Hallo,

ich habe über Programme TXT Dateien erzeugt bekommen. Nun möchte ich per Batch oder vbs Script erreichen, dass aus diesem Verzeichnis X alle TXT Dateien die erste Zeile gelöscht wird.
Die Dateien sollen nicht unter einem anderen Namen gespeichert werden, sondern nur erste Zeile entfernen und dann speichern.

Ich kenne mich mit scripten nicht aus, daher die Frage im Forum.

Danke für eure Hilfe

Content-ID: 190555

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

Ausgedruckt am: 22.11.2024 um 01:11 Uhr

86263
86263 31.08.2012 aktualisiert um 20:26:05 Uhr
Goto Top
Hallo,
in etwa so?

@echo off & setlocal

set "folder=C:\Folder"  

pushd "%folder%" || goto :eof  
for /f "delims=" %%a in ('dir /a-d /b *.txt') do (  
  set "filename=%%a"  
  call :procFile
)
goto :eof

:procFile
type nul>"tmp.txt"  
for /f "delims=: tokens=1*" %%b in ('findstr /n /r /c:"^" "%filename%"') do (  
  set "lineNr=%%b"  
  set "lineTxt=%%c"  
  call :procLine
)
move "tmp.txt" "%filename%"  
goto :eof

:procLine
if %lineNr% leq 1 goto :eof
if not defined lineTxt (
  >>"tmp.txt" echo.  
  goto :eof
)
set "lineTxt=%lineTxt:^=^^%"  
set "lineTxt=%lineTxt:&=^&%"  
set "lineTxt=%lineTxt:<=^<%"  
set "lineTxt=%lineTxt:>=^>%"  
set "lineTxt=%lineTxt:|=^|%"  
>>"tmp.txt" echo.%lineTxt%  
goto :eof

Gruß,
DB
bytecounter
bytecounter 31.08.2012 aktualisiert um 20:28:57 Uhr
Goto Top
Hallo,

die erste Zeile kannst Du wie folgt entfernen:

FOR /F "tokens=*" %%a IN ('DIR *.txt /B') DO (  
  RENAME "%%a" "%%a.bak"  

  FOR /F "tokens=* skip=1 usebackq" %%b IN ("%%a.BAK") DO (  
    ECHO %%b >>"%%a"  
  )

  
)

Anschließend kannst Du die .bak Dateien löschen:

del *.bak

vg
bastla
bastla 31.08.2012 um 21:20:18 Uhr
Goto Top
Hallo @all!

Vielleicht auch so (ungetestet):
for /f "delims=" %%i in ('dir /b *.txt') do (  
    more +1 "%%i">"%temp%\Tmp.txt"  
    move "%temp%\Tmp.txt" "%%i"  
)
Grüße
bastla
60730
60730 31.08.2012 aktualisiert um 21:27:19 Uhr
Goto Top
Moin,

Ohne den beiden vorschreibern nahetreten zu wollen, aber beide loesungen haben einen je einen haken.....

More verschluckt gerne mal tabs in "tabellen", for schleifen moegen bestimmte sonderzeichen nicht.

Von daher, warum willst du das denn ueberhaupt machen?

Und dann, wie willst du verhindern, dass das script eine datei nicht per dummen zufall 2 mal anfasst und dir dann ? Zeilen fehlen?

Gruss
intermde
intermde 31.08.2012 um 21:54:24 Uhr
Goto Top
Hintergrund ist eigentlich, dass diese Dateien in Access weiter verwendet werden sollen

Problem, in Access kann ich bei import nicht angeben, dass er die erste Zeile ignorieren soll, da erst in der zweiten Zeile "Spaltenüberschriften" stehen

Hab nun aber festgestellt, dass Access Probleme hat die Dateien zu importieren wenn als Trennzeichen ein ","
ersetzte ich dieses händisch durch ein ";" kann die Datei eingebunden werden.

wie kann ich das Script

@echo off & setlocal

set "folder=C:\Folder"  

pushd "%folder%" || goto :eof  
for /f "delims=" %%a in ('dir /a-d /b *.txt') do (  
  set "filename=%%a"  
  call :procFile
)
goto :eof

:procFile
type nul>"tmp.txt"  
for /f "delims=: tokens=1*" %%b in ('findstr /n /r /c:"^" "%filename%"') do (  
  set "lineNr=%%b"  
  set "lineTxt=%%c"  
  call :procLine
)
move "tmp.txt" "%filename%"  
goto :eof

:procLine
if %lineNr% leq 1 goto :eof
if not defined lineTxt (
  >>"tmp.txt" echo.  
  goto :eof
)
set "lineTxt=%lineTxt:^=^^%"  
set "lineTxt=%lineTxt:&=^&%"  
set "lineTxt=%lineTxt:<=^<%"  
set "lineTxt=%lineTxt:>=^>%"  
set "lineTxt=%lineTxt:|=^|%"  
>>"tmp.txt" echo.%lineTxt%  
goto :eof

erweitern, dass er mir ein "," mit ";" ersetzt.

bzw. wie man beides miteinander kombinieren kann,
sprich erstze nur die erste zeile und ersetzte in den Dateien das "," durch ";"

Danke nochmal für die Hinweise.
60730
60730 31.08.2012 aktualisiert um 22:52:35 Uhr
Goto Top
Ganz ehrlich?

Schaff dir nen mysqlserver an, verlagere die tabellen in diese und verknuepfe die in access und du hast nicht nur einen riesen schritt in sachen performance gemacht, auch das rumfuhrwerken in den daten kannst du dir sparen.
Mysql kann logischerweise auch ein skip xxx beim importieren.

Gruss
pieh-ejdsch
pieh-ejdsch 31.08.2012 aktualisiert um 23:06:31 Uhr
Goto Top
moin,

dann definiere doch mal genau wie die erste Zeile sich von den Anderen Zeilen Unterscheidet, dann liese sich auch ein doppeltes Anfassen der Datei verhindern.

Sonst würde ich dies Einfach mit einer Ordentlich angelegten Temporären Datei Lösen - was auch Fixer geht.
@echo off
setlocal disabledelayedexpansion
pushD D:\Ordner ||echo Datei nicht gefunden! 1>&2 &&exit /b 1
for /f delims^= %%i in ('dir /a-d /b *.txt' ) do (  
  findstr /n "^" "%%~i"|find /vb "1:" 1>"%temp%\wO1st.txt"  
  (
  for /f "usebackqdelims=" %%j in ("%temp%\wO1st.txt" ) do (  
    set "line=%%i"  
    setlocal enabledelayedexpansion
    set "Line=!Line:,=;!"  
    echo(!Line:*:=!
    endlocal
  ))>"%%~i"  
)
del "%temp%\wO1st.txt"  

Gruß Phil
bastla
bastla 01.09.2012 aktualisiert um 00:03:18 Uhr
Goto Top
@ T-Mo
VBS verschluckt jedenfalls nix face-wink:
Ordner = "D:\X"  
Typ = "txt" 'in Kleinbuchstaben  

Set fso = CreateObject("Scripting.FileSystemObject")  
For Each Datei In fso.GetFolder(Ordner).Files
    If LCase(fso.GetExtensionName(Datei.Name)) = Typ Then
        T = Datei.OpenAsTextStream.ReadAll
        fso.CreateTextFile(Datei.Path).Write Mid(Replace(T, ",", ";"), InStr(T, vbNewline) + 2)  
    End If
Next
Und dann, wie willst du verhindern, dass das script eine datei nicht per dummen zufall 2 mal anfasst und dir dann ? Zeilen fehlen?
Soferne der Batch nur einmal läuft, kommt mit "dir /b" jede Datei auch nur einmal an die Reihe ...

Grüße
bastla
Pjordorf
Pjordorf 01.09.2012 um 01:26:15 Uhr
Goto Top
Hallo,

Zitat von @intermde:
Problem, in Access kann ich bei import nicht angeben, dass er die erste Zeile ignorieren soll,
In Access 2003 und 2007 geht das sehr wohl. Und ich meine es auch in Access 2000 schon gemacht zu haben.

Hab nun aber festgestellt, dass Access Probleme hat die Dateien zu importieren wenn als Trennzeichen ein ","
Auch das geht seit Access 2000. Du kannst im Import fast jedes Zeichen als Trennzeichen definieren und noch etliche Optionen mehr.

Hier mal mit Access 2007 der Import einer .CSV Datei als Beispiel.
bac023a2dcccc00311307858064ccf7b
de8dcac1d63eee09ab83b28d4d7c8f3a
9a356409d604ad60f5c0a08ddff08b32
f63e44dfaf120c14be63d6c9354c6577

Und was du hier Händisch tun kannst, kann auch per VBA Automatisiert werden.

Gruß,
Peter
intermde
intermde 01.09.2012 um 05:11:08 Uhr
Goto Top
Hallo, dank euch für die vielen Hinweise und Lösungen.
hab es soweit nun hinbekommen wie ich es für Access benötige.
werde nin eine weitere Frage eröffnen müssen, damit ich die Daten besser verwalten kann.

Denoch nochmal ein Dankeschön.
60730
60730 01.09.2012 um 10:46:47 Uhr
Goto Top
(ot)

Bastla, "mir" musst du das doch nicht erklaeren face-wink
Frueher hab ich sowas ja auch mal mit der not dem teufel und den fliegen gesehen, aber mittlerweile sehe ich das aehnlich wie ein uns allen bekanntes geschoepf, was es damals (aus nicht nachvollziehbaten gruenden) nicht zu den bremer stadtmusikanten geschafft hat face-wink