Saved Bookmarks
| 1. |
Solve : delete first n lines from a file? |
|
Answer» hi all, If you till tell me the maximum length of the a line, I can make you a quick program that will let you enter the number of lines to skip and then willl copy the rest of the file.That seems kind of limited if you ask me. Granted the cmd processor is limited to 8192 bytes to assign to a variable but what are the odds of the lines being that long.A For loop will probably not copy blank lines. Use the More command with the +n switch. Quote from: Dusty on February 19, 2012, 11:52:49 PM A For loop will probably not copy blank lines. Or ones starting with a space or semicolon, I think. And poison characters will STOP the script dead. Barring any line starting with a colon this will work. I can change the code as well if the file has a line that starts with a colon. Input Code: [Select]Line:1 Line:2 Line:3 Line:4 Line:5 Line:6 next line is blank Line:8 next line has special characters #[email protected]#$%^&*()+<>"':!%%! Line:10Script Code: [Select]echo off for /f "skip=5 tokens=1* delims=:" %%G in ('type "myfile.txt" ^| findstr /n "^"') do echo.%%H>>myfile_new.txtOutput Code: [Select]Line:6 next line is blank Line:8 next line has special characters #[email protected]#$%^&*()+<>"':!%%! Line:10Keeping to the KISS principle: Code: [Select]more +n myfile.txt > newfile.txt Quote from: Dusty on February 20, 2012, 11:11:05 PM Keeping to the KISS principle:As far as I can tell that will not work if the number of lines in the FILES exceeds 65,534. Which most of mine do. I do data processing for a living. On the 65,535 line it outputs -- More (4%) -- to the output file and the batch file pauses. Quote from: Squashman on February 21, 2012, 05:42:01 AM As far as I can tell that will not work if the number of lines in the files exceeds 65,534. Which most of mine do. skipline.vbs Code: [Select]Const ForReading = 1 Const ForWriting = 2 Set objFSO = CreateObject("Scripting.FileSystemObject") ReadFileName = wscript.arguments(0) LinesToSkip = wscript.arguments(1) WriteFileName = wscript.arguments(2) ' for demo purposes; can delete '-------------------------------------- StartRead = Timer '-------------------------------------- Set ReadFile = objFSO.OpenTextFile (wscript.arguments(0), ForReading) strText = ReadFile.ReadAll Readfile.Close ' for demo purposes; can delete '-------------------------------------- EndRead = Timer ReadTime = EndRead - StartRead StartSplit = Timer '-------------------------------------- ArrayOfLines = Split(strText, vbCrLf) ' for demo purposes; can delete '-------------------------------------- Endsplit = Timer SplitTime = Endsplit - StartSplit StartWrite = Timer '-------------------------------------- Set Writefile = objFSO.CreateTextFile (WriteFileName, ForWriting) For j = LinesToSkip To UBound(ArrayOfLines) Writefile.writeline ArrayOfLines(j) Next Writefile.Close ' for demo purposes; can delete '-------------------------------------- EndWrite = Timer TotalTime = EndWrite - StartRead WriteTime = EndWrite - StartWrite wscript.echo "Number of Lines in file: " & UBound(ArrayOfLines) wscript.echo "Read file in " & ReadTime & " sec(s)" wscript.echo "Split file in " & SplitTime & " sec(s)" wscript.echo "Wrote output file in " & WriteTime & " sec(s)" wscript.echo "Total time taken " & TotalTime & " sec(s)" '-------------------------------------- Code: [Select]C:\Batch\Test\>type 20lines.txt This is line 1 This is line 2 This is line 3 This is line 4 This is line 5 This is line 6 This is line 7 This is line 8 This is line 9 This is line 10 This is line 11 This is line 12 This is line 13 This is line 14 This is line 15 This is line 16 This is line 17 This is line 18 This is line 19 This is line 20 C:\Batch\Test\>cscript.exe //nologo skipline.vbs "20lines.txt" 3 "outlist.txt" Number of Lines in file: 20 Read file in 0 sec(s) Split file in 0 sec(s) Wrote output file in 0.0078125 sec(s) Total time taken 0.0078125 sec(s) C:\Batch\Test\>type outlist.txt This is line 4 This is line 5 This is line 6 This is line 7 This is line 8 This is line 9 This is line 10 This is line 11 This is line 12 This is line 13 This is line 14 This is line 15 This is line 16 This is line 17 This is line 18 This is line 19 This is line 20 Note: the load and split times for the small file are too short for the VBScript timer function to measure. Now for some real files... Clist.csv has nearly 300,000 lines like this and is 36 MB in SIZE "CreationTime","Length","FullName" "04/06/2011 08:43:43","4226277376","C:\pagefile.sys" "02/06/2011 21:08:43","3169705984","C:\hiberfil.sys" "05/03/2011 08:14:10","2376366352","C:\Documents and Settings\Mike\X15-65732.iso" "05/03/2011 08:14:10","2376366352","C:\Users\Mike\X15-65732.iso" "07/07/2011 20:39:09","1818939392","C:\Users\Mike\AppData\Local\Microsoft\Windows Virtual PC\Virtual Machines\Windows XP Mode.vhd" "07/07/2011 20:39:09","1818939392","C:\Documents and Settings\Mike\AppData\Local\Microsoft\Windows Virtual PC\Virtual Machines\Windows XP Mode.vhd" Code: [Select]C:\Batch\Test\>cscript.exe //nologo skipline.vbs "Clist.csv" 3 "outlist.txt" Number of Lines in file: 294457 Read file in 1.953125 sec(s) Split file in 0.6328125 sec(s) Wrote output file in 3.632813 sec(s) Total time taken 6.21875 sec(s) Big-Clist.csv has nearly a million lines and is 108 MB in size Code: [Select]C:\Batch\Test\>cscript.exe //nologo skipline.vbs "Big-Clist.csv" 3 "outlist.txt" Number of Lines in file: 883371 Read file in 5.164063 sec(s) Split file in 5.390625 sec(s) Wrote output file in 10.95313 sec(s) Total time taken 21.50781 sec(s) System: AMD Phenom II 3.0 GHz 4 GB RAM drive: 7200 rpm SATA Nice Job. Vbscript has always been one of those things I have just refused to learn.In my script above, is this: Code: [Select]Set ReadFile = objFSO.OpenTextFile (wscript.arguments(0), ForReading) That will work, but for consistency it should be Code: [Select]Set ReadFile = objFSO.OpenTextFile (ReadFileName, ForReading) Quote Vbscript has always been one of those things I have just refused to learn. It's not all that HARD, especially if you can use it to do useful things, and it can do so much more than batch. Of course Powershell is the way to go nowadays... I started pushing myself to use Powershell 2 years ago and then I went on vacationand when I got back to work I said screw it. But it made me realize that object oriented programming is pretty awesome. I was even making gui's with my Powershell scripts. |
|