Regels verwijderen

Status
Niet open voor verdere reacties.

pasibun

Gebruiker
Lid geworden
26 apr 2013
Berichten
22
Goedemorgen,

Ik heb een vraag, ik ben opzoek naar een batch bestand die een .txt bestand kan openen en een x aantal regels verwijdert.

Ik weet niet of dit mogelijk is met een batch bestand, maar daarom vraag ik het hier.
Het programmetje moet de laatste 50 regels uit het .txt bestand bewaren en de rest mag weg.

Ik hoop dat iemand mij kan helpen!

Gr,
 
Zou zo moeten kunnen (parameter die je moet meegeven aan de batch-file is de bestandsnaam waar de laatste 50 regels van bewaard moeten blijven):

Code:
@echo off
setlocal enabledelayedexpansion
set count=
for /f %%x in ('type %1 ^| find /c /v ""') do set /a lines=%%x-50
copy /y nul %tmp%\tmp.zzz > nul
for /f "tokens=*" %%x in ('type %1 ^| find /v ""') do (
  set /a count=count+1
  if !count! geq %lines% echo %%x>>%tmp%\tmp.zzz
)
move /y %tmp%\tmp.zzz %1 > nul

Aangepast van deze link, waar precies het tegenovergestelde werd gevraagd, namelijk x regels verwijderen aan het einde.
Test dit eerst goed, want geen garantie. :D

Alternatief is de volgende code:
Code:
@echo OFF

:: Get the number of lines in the file
set LINES=0
for /f "delims==" %%I in ('type %1') do (
    set /a LINES=LINES+1
)

:: Export the last 50 lines to uitvoer.txt
set /a LINES=LINES-50
more +%LINES% < %1 > uitvoer.txt

Hier wordt de uitvoer in uitvoer.txt geschreven, maar je kunt uit de andere code wel halen hoe (via een tussenbestand) ook het originele bestand kan worden overschreven.

Tijs.
 
Laatst bewerkt:
Super bedankt voor je snelle reactie!


Maar zou je iets meer uitleg kunnen geven erbij?
Waar moet in bij het eerste script de file naam plaatsen?
 
Stel dat je de eerste code opslaat als verklein.bat
Dan moet je het te bewerken .txt bestand als parameter erbij aangeven.
Het wordt dan dus: verklein.bat bestandsnaam.txt

Tijs.
 
Tijs,

Nogmaals super bedankt, ik heb er nog even naar gekeken maar ik kwam er nog niet helemaal uit.
Wat ik heb gedaan is als volgt:
Verklein.bat:
Code:
@echo off
setlocal enabledelayedexpansion
set count=
for /f %%x in ('type %1 ^| find /c /v ""') do set /a lines=%%x-50
copy /y nul %tmp%\tmp.zzz > nul
for /f "tokens=*" %%x in ('type %1 ^| find /v ""') do (
  set /a count=count+1
  if !count! geq %lines% echo %%x>>%tmp%\tmp.zzz
)
move /y %tmp%\tmp.zzz %1 > nul

Moet ik in dit bestand nog dingen aanpassen?

Vervolgens heb ik het
.txt bestandje:
Code:
Regel 1
Regel 2
Regel 3
Regel 4
Regel 5
Regel 6
Regel 7
Regel 8
Regel 9
Regel 10
Regel 11
Regel 12
Regel 13
Regel 14
Regel 15
Regel 16
Regel 17
Regel 18
Regel 19
Regel 20
Regel 21
Regel 22
Regel 23
Regel 24
Regel 25
Regel 26
Regel 27
Regel 28
Regel 29
Regel 30
Regel 31
Regel 32
Regel 33
Regel 34
Regel 35
Regel 36
Regel 37
Regel 38
Regel 39
Regel 40
Regel 41
Regel 42
Regel 43
Regel 44
Regel 45
Regel 46
Regel 47
Regel 48
Regel 49
Regel 50
Regel 51
Regel 52
Regel 53
Regel 54
Regel 55
Regel 56
Regel 57
Regel 58
Regel 59
Regel 60
Regel 61
Regel 62
Regel 63
Regel 64
Regel 65
Regel 66
Regel 67
Regel 68
Regel 69
Regel 70
Regel 71
Regel 72
Regel 73
Regel 74
Regel 75
Regel 76
Regel 77
Regel 78
Regel 79
Regel 80
Regel 81
Regel 82
Regel 83
Regel 84
Regel 85
Regel 86
Regel 87
Regel 88
Regel 89
Regel 90
Regel 91
Regel 92
Regel 93
Regel 94
Regel 95
Regel 96
Regel 97
Regel 98
Regel 99
Regel 100

Wat moet ik doen om de laatste 50 regels te bewaren?

Gr,
 
a. batch-bestand en .txt bestand in dezelfde map zetten.
b. batch-bestand aanroepen met als parameter de naam van het .txt bestand. Ik heb al een voorbeeld gegeven m.b.t. de bestandsnamen en aanroep, dus richt je eerst even daarop.

Tijs.
 
Ik heb een tijdje zitten zoeken, om een beetje bekent te worden met de code.
Ik vind je uitleg een beetje vreemd, want na mijn weten hoef ik niks aan het .bat bestand aan te passen (qua inhoud).
Je geeft aan om als parameter de naam van het .txt bestand aan te roepen. bijvoorbeeld zo: verklein.bat bestandsnaam.txt .
Wat ik hier al boven zei, ik denk dat ik in het .bat bestand niks hoef aan te passen.
Maar nu vraag ik me af hoe ik dan op een andere manier het .txt bestand kan aanroepen.

De taal is voor mij geheel nieuw, vandaar mijn vragen.

Matthijs
 
Je kunt ook een snelkoppeling maken, waarbij je bladert naar verklein.bat. Daarna de zojuist gemaakte snelkoppeling aanpassen en helemaal achteraan bij de sectie Doel een spatie typen en daar weer achter de naam van het .txt bestand en het dan opslaan.

Tijs.
 
Super bedankt, het werkt!

Ik heb nu alleen nog 1 probleempje, want bij het .txt bestand die ik hier boven heb aangegeven doet het gewoon.
Maar zodra ik een ander .txt bestand pak doet hij het niet, hij maakt hem dan gewoon helemaal leeg.
Ik weet ook waarom het .bat bestand alles leeg maakt, omdat sommige regels zo lang zijn dat ze op een nieuwe regel beginnen.
Heb je hier toevallig een oplossing voor?

Matthijs
 
Laatst bewerkt:
Ik zou meer verwachten dat die andere .txt minder dan 50 regels bevat.
Als dat inderdaad zo is, dan wordt er niets in zzz.tmp geschreven, en omdat zzz.tmp uiteindelijk over het originele .txt bestand wordt geschreven is die laatste dan ook leeg.
Test eens de volgende variatie van verklein.bat, die (als het goed is) bestanden met minder dan 50 regels onveranderd laat.

@echo off
setlocal enabledelayedexpansion
set count=
for /f %%x in ('type %1 ^| find /c /v ""') do set /a lines=%%x-50
if !lines! leq 0 goto end
copy /y nul %tmp%\tmp.zzz > nul
for /f "tokens=*" %%x in ('type %1 ^| find /v ""') do (
set /a count=count+1
if !count! geq %lines% echo %%x>>%tmp%\tmp.zzz
)
move /y %tmp%\tmp.zzz %1 > nul
:end
 
Hij laat het .txt bestand met minder dan 50 regels onveranderd.
Dus dit is goed, maar ik heb een .txt bestand met 2873 regels.
En deze maakt hij helemaal leeg.
 
Hoeveel karakters lang zijn die regels, nu je denkt dat daar mogelijk het probleem vandaan komt?

Tijs.
 
De langste regel is +/- 585 karakters.
Dit is dus een ongelooflijk lange zin.
Ik heb zelf ook even wat geprobeerd, heb gewoon wat random text in een .txt bestand gezet, zoveel text dat hij door loopt op de volgende regel.
Ook bij dit .txt bestand werkt het .bat bestand niet, nou goed hij maakt dan het hele .txt bestand leeg.

Matthijs
 
Dan moet ik inderdaad ervan uitgaan dat het batch-bestand er niet mee kan omgaan, met dergelijke lange regels.

Probeer dan de alternatieve code:
Code:
@echo OFF

:: Get the number of lines in the file
set LINES=0
for /f "delims==" %%I in ('type %1') do (
    set /a LINES=LINES+1
)

:: Export the last 50 lines to a temp file which is renamed as the original file
set /a LINES=LINES-50
more +%LINES% < %1 > %tmp%\tmp.zzz
move /y %tmp%\tmp.zzz %1 > nul

Tijs.
 
Tijs,

Super bedankt! Hij werkt helemaal!
Ik had nog twee vragen, waar het bat bestand de tmp.zzz opslaat en is het mogelijk om het .txt bestand in de .bat bestand aan te roepen? Ik roep hem nu aan op de manier hoe jij het zegt, via het doel. Maar zou het fijn vinden om het .txt bestand aan te roepen in het .bat bestand


Gr,
Matthijs
 
Laatst bewerkt:
Zou dan worden:

more +%LINES% < %1 > %1

en de laatste regel eruit halen, die met het Move command erin.

Maar of dit goed werkt zul je zelf moeten testen. Persoonlijk houd ik liever een tussenbestand erbij (dus dat %tmp%\tmp.zzz bestand)

Tijs.
 
Dank je wel, ik zal het vandaag even testen.

Maar mijn andere vraag, zou het mogelijk zijn om in het .bat bestand het .txt bestand aan te roepen?
En niet via jou manier.
Je kunt ook een snelkoppeling maken, waarbij je bladert naar verklein.bat. Daarna de zojuist gemaakte snelkoppeling aanpassen en helemaal achteraan bij de sectie Doel een spatie typen en daar weer achter de naam van het .txt bestand en het dan opslaan.

Tijs.

Matthijs
 
Je kunt het hard coderen, maar dat is inflexibel. Vervang bestandsnaam.txt door de naam van het .txt bestand.

Code:
@echo OFF

:: Get the number of lines in the file
set LINES=0
for /f "delims==" %%I in ('type [COLOR="#FF0000"]bestandsnaam.txt[/COLOR]') do (
    set /a LINES=LINES+1
)

:: Export the last 50 lines to a temp file which is renamed as the original file
set /a LINES=LINES-50
more +%LINES% < [COLOR="#FF0000"]bestandsnaam.txt[/COLOR] > %tmp%\tmp.zzz
move /y %tmp%\tmp.zzz [COLOR="#FF0000"]bestandsnaam.txt[/COLOR] > nul

Tijs.
 
Oke dit is nu mijn batch file.
Code:
@ECHO OFF
REM
REM		Kopieren van nieuwe maillog van Formdesigner
REM
copy		"D:\Formdesigner\fdds\log\mail.log" "\\fs2\DATA_2\tijdelijk\edifakt\maillog.txt"

ping -n 5 -w 1 127.0.0.1>nul

:: Get the number of lines in the file
set LINES=0
for /f "delims==" %%I in ('type \\fs2\DATA_2\tijdelijk\edifakt\maillog.txt') do (
    set /a LINES=LINES+1
)

:: Export the last 10 lines to a temp file which is renamed as the original file
set /a LINES=LINES-10
more +%LINES% < \\fs2\DATA_2\tijdelijk\edifakt\maillog.txt > %tmp%\tmp.zzz
move /y %tmp%\tmp.zzz \\fs2\DATA_2\tijdelijk\edifakt\maillog.txt > nul

ECHO DONE!!!
ECHO.

Als ik dit bestand nu uitvoer, bewaard hij +/- 100 regels, ik snap dus niet de waarde van de is:
Code:
set /a LINES=LINES-10
Hieruit maakt ik op dat hij 10 regels bewaard.

Als ik het script zo uitvoer:
Code:
@ECHO OFF
REM
REM		Kopieren van nieuwe maillog van Formdesigner
REM
copy		"D:\Formdesigner\fdds\log\mail.log" "\\fs2\DATA_2\tijdelijk\edifakt\maillog.txt"

ping -n 5 -w 1 127.0.0.1>nul

:: Get the number of lines in the file
set LINES=0
for /f "delims==" %%I in ('type \\fs2\DATA_2\tijdelijk\edifakt\maillog.txt') do (
    set /a LINES=LINES+1
)

:: Export the last 10 lines to a temp file which is renamed as the original file
set /a LINES=LINES-10
more +%LINES% < \\fs2\DATA_2\tijdelijk\edifakt\maillog.txt > %tmp%\tmp.zzz
move /y %tmp%\tmp.zzz \\fs2\DATA_2\tijdelijk\edifakt\maillog.txt > nul

:: Get the number of lines in the file
set LINES=0
for /f "delims==" %%I in ('type \\fs2\DATA_2\tijdelijk\edifakt\maillog.txt') do (
    set /a LINES=LINES+1
)

:: Export the last 10 lines to a temp file which is renamed as the original file
set /a LINES=LINES-10
more +%LINES% < \\fs2\DATA_2\tijdelijk\edifakt\maillog.txt > %tmp%\tmp.zzz
move /y %tmp%\tmp.zzz \\fs2\DATA_2\tijdelijk\edifakt\maillog.txt > nul

ECHO DONE!!!
ECHO.

Dan bewaard hij de laatste 50 regels.
Zou je kunnen uitleggen hoe het werkt?


Gr,
Matthijs
 
Moet ik me nu echt gaan ergeren of zo?
In de originele code staat toch echt:
set /a LINES=LINES-50
Dus waarom heb jij daar (ineens) -10 van gemaakt?

Oftewel: Haal 50 af van het totale aantal regels in het .txt bestand, want alles dat daarna staat moet gehandhaafd blijven. Is dus een offset.

Tijs.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan