2014-11-12 5 views
1

У меня есть много текстовых файлов, которые должны быть удалены из первых 26 строк. Я пробовал нижнюю биту, но он не хочет даже закончить первый текстовый файл. Файлы называются данные (1) .txt, данные (2) .txt, данные (3) .txt, ... и т.д.Как удалить первые n строк в текстовом файле с использованием командного файла (в Windows)

Сначала я попробовал ...

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», но похоже, что это только скопировали половину из исходный текстовый файл. Файлы находятся от 1 МБ до ~ 300 МБ каждый.

Так что мой вопрос прост. Что я делаю неправильно, и может ли кто-нибудь предоставить помощь/советы?

UPDATE

Так я продолжая играть со вторым вариантом, и это, кажется, работает для файлов до ~ 125 МБ ничего более, что и он просто делает паузу и не завершить операцию. Не уверен, есть ли исправление для этого или, возможно, лучший вариант, а затем использовать командный файл. Снова любая помощь приветствуется.

UPDATE

Я был в состоянии получить то, что я искал через JAVA.

Садд

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) {} 
 
      } 
 
     } 
 
    } 
 
}

+0

Вы пробовали использовать 'xargs'? – robertjd

+0

@robertjd У меня есть доступ к окнам при попытке выполнить эту задачу. – Matt

+0

Вместо этого используйте PowerShell. –

ответ

0

Если вы заметили последнюю строку выходного файла, вы заметите, ограничение вашего подхода. Когда количество строк превышает ~ 65535, MORE зависает, ожидая нажатия клавиши от пользователя.

enter image description here

Вы можете использовать цикл вместо:

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

Попытка того, что вы опубликовали, и она просто открывает командную строку на секунду и закрывается с завершением чего-либо ... – Matt

+0

Забыл упомянуть, что он работает только в текстовых файлах, закодированных в ANSI и UTF-8, а не в Юникоде. Попробуйте конвертировать ваши файлы в UTF-8 с помощью блокнота. –

+0

Если у вас слишком много файлов, вы можете запустить цикл for для всех файлов с помощью команды 'type' для преобразования всех файлов Unicode в ANSI. Что-то вроде 'for %% I in (* .txt) делает тип« %% I »> %% I.new', а затем использует' move' для замены исходных файлов на новые файлы, такие как код в вашем вопросе. Обратите внимание, что это вариант, только если ваши текстовые файлы не содержат специальных символов (в основном неанглийских символов), иначе вы можете потерять данные во время преобразования. –

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") 

Примечание: Существует -i переключатель для gnuwin32 SED (для обработки инлайн), который сделал бы синтаксис немного проще, но в последний раз я попробовал это оставил файл мусора для каждого реального файла она обрабатывается. Я рекомендую не использовать его.

Я знаю from painful experience, что использование приложения обработки потока для обработки больших текстовых файлов намного быстрее, чем обходной скрипт и for /f.

Если вы хотите избежать использования gnuwin32 sed и предпочли бы использовать powershell, see this question's accepted answer для стоящего метода попробовать. Не знаю, будет ли это так быстро или быстрее, чем sed. Bill_Stewart с энтузиазмом относится к этому. :)

+0

Нет необходимости скачивать файлы. Забудьте об использовании сценария командной оболочки cmd.exe (пакетный) 'для/f' уродства и просто используйте PowerShell. –

Смежные вопросы