如何使用批处理文件删除文本文件中的前n行(在Windows上)

时间:2014-11-12 17:21:52

标签: java windows batch-file cmd

我有各种数量的文本文件需要删除前26行。我尝试了下面的蝙蝠,但它甚至不想完成第一个文本文件。这些文件名为data(1).txt,data(2).txt,data(3).txt,...等。

起初我试过......

more +26 "data (1).txt" > "data (1).txt.new"
move /y "data (1).txt.new" "data (1).txt"

这很有用,但是因为我有大约100个文本文件,所以更改每个数字会非常耗时。

然后尝试执行以下操作。

for %%f in (*.txt) do (
more +26 "%%f" > "%%f.new"
move /y "%%f.new" "%%f")

对我来说,这似乎应该可行,但事实并非如此,它只是拉起命令行并在第一个文件上停顿,它确实创建了" NEW"文件,但看起来它只复制了原始文本文件的一半。文件大小分别为1MB到300MB。

所以我的问题很简单..我做错了什么,谁能提供帮助/提示?

更新

所以我一直在继续使用第二个选项,它似乎适用于高达125MB以上的文件而且它只是暂停并且没有完成操作。不确定是否有修复,或者可能是更好的选择,然后使用批处理文件。再次感谢任何帮助。

更新

我能够通过JAVA得到我想要的东西。

SADD



import java.io.bufferedreader;
import java.io.file;
import java.io.filereader;
import java.io.filewriter;

public class cleanfiles {
  public static void main(string[] args) throws exception {
    string currdir = system.getproperty("user.dir");
    file inputdir = new file(currdir + file.separator + "input" + file.separator);
    file[] inputfiles = inputdir.listfiles();
    
    String outputdir = currdir + file.separator + "output" + file.separator;
    for (file inputfile : inputfiles) {
      if (inputfile.getabsolutepath().endswith(".txt") == false) {continue; }
      file outputfile = new file(outputdir + inputfile.getname() + ".csv");
      bufferedreader reader = null;
      try {
        reader = new bufferedreader(new filereader(inputfile));
        writer = new filewriter(outputfile);
        
        string line;
        while ((line = reader.readline()) !=null) {
          if (line.startswith("Point")) {
            writer.append(line);
            writer.append("\r\n");
            break;
            }
          }
        while ((line = reader.readline()) !=null) {
          writer.append(line);
          writer.append("\r\n");
          }
        } catch (exception e) {
        } finally {
            try {
              reader.close();
              writer.flush();
              writer.close();
            } catch (exception e) {}
          }
      }
    }
}




2 个答案:

答案 0 :(得分:1)

我建议使用sed for Windows。您将需要从该页面链接的二进制文件和依赖项。然后,您可以在命令行的sed "1,26d" infile >outfile循环中for删除文件的前26行。不需要批处理文件。

for %I in (*.txt) do (sed "1,26d" "%I" >"%I.1" && move /y "%I.1" "%I")

注意:gnuwin32 sed(用于内联处理)有一个-i开关,这会使语法更简单,但是上次我尝试它时,它为它处理的每个真实文件留下了一个垃圾文件。我建议不要使用它。

我知道from painful experience使用流处理应用程序处理大型文本文件比批处理脚本欺骗和for /f循环快得多。

如果你想避免使用gnuwin32 sed并且更愿意使用powershell see this question's accepted answer来尝试一个有价值的方法。不知道它是否比sed更快或更快。 Bill_Stewart似乎对此充满热情。 :)

答案 1 :(得分:0)

如果您注意到输出文件的最后一行,您会注意到您的方法的局限性。当行数超过~65535时,MORE挂起,等待用户按键。

enter image description here

您可以改为使用for循环:

for %%I in (*.txt) do for /f "delims=, tokens=* skip=26" %%x in (%%I) do echo %%x >> "%%I.new"