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-Key: 190555

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

Printed on: April 24, 2024 at 11:04 o'clock

Mitglied: 86263
86263 Aug 31, 2012 updated at 18:26:05 (UTC)
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
Member: bytecounter
bytecounter Aug 31, 2012 updated at 18:28:57 (UTC)
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
Member: bastla
bastla Aug 31, 2012 at 19:20:18 (UTC)
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
Mitglied: 60730
60730 Aug 31, 2012 updated at 19:27:19 (UTC)
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
Member: intermde
intermde Aug 31, 2012 at 19:54:24 (UTC)
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.
Mitglied: 60730
60730 Aug 31, 2012 updated at 20:52:35 (UTC)
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
Member: pieh-ejdsch
pieh-ejdsch Aug 31, 2012 updated at 21:06:31 (UTC)
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
Member: bastla
bastla Aug 31, 2012 updated at 22:03:18 (UTC)
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
Member: Pjordorf
Pjordorf Aug 31, 2012 at 23:26:15 (UTC)
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
Member: intermde
intermde Sep 01, 2012 at 03:11:08 (UTC)
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.
Mitglied: 60730
60730 Sep 01, 2012 at 08:46:47 (UTC)
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