4

Помогите, пожалуйста, как перевернуть / отсортировать строку в текстовом файле с помощью пакета в Windows?
Пример:
У меня есть текст в этом формате

15/04/2013-07:10:30 Лалала
15/04/2013-07:10:30 Текстовый текст
15/04/2013-07:10:30 1 лала Текст

15/04/2013-07:10:36 8 текст lala X
15/04/2013-07:10:36 Текст Lala 1

17/04/2013-10:11:12 B bext lala 4
... (другие строки)

и мне нужно поменять его в этом формате

17/04/2013-10:11:12 B bext lala 4
15/04/2013-07:10:36 Текст Lala 1
15/04/2013-07:10:36 8 текст lala X
15/04/2013-07:10:30 1 лала Текст
15/04/2013-07:10:30 Текстовый текст
15/04/2013-07:10:30 Лалала
... (другие строки)

Спасибо за помощь!

5 ответов5

13

Может быть, это не самый красивый способ, но он просто и работает, как вы хотите.

echo. > output.txt

for /f  "delims=@" %%j in (yourfile.txt) do (
    type output.txt > tmp
    echo %%j > output.txt
    type tmp >> output.txt
)

del tmp

Не используйте приведенный выше пример, если вы хотите обрабатывать большие файлы. Это действительно решение, требующее много времени и ресурсов. Здесь у вас есть более быстрая версия, которую я только что подготовил:

setlocal enabledelayedexpansion

set I=0

for /F "tokens=*" %%k in (yourfile.txt) do (
  set /A I=!I! + 1
  set LINE!I!=%%k
)

for /L %%c in (!I!,-1,1) do (
  echo !LINE%%c! >> out.txt
)

Обратный файл 40 Кб (10 Кб, по 1 символу в каждом) занял ~ 1 минуту на моей машине. Помните, что это все еще только партия. Есть много лучших скриптов или языков программирования, которые лучше выполнять эту операцию.

2
perl -e "print reverse <>" file > file_reversed

Обратите внимание, что в Windows вам придется использовать двойные кавычки вместо одинарных кавычек для разделения строки perl.

1

Я подумал, что добавлю это как второй подход, так как он может работать лучше для некоторых:

Если вы открыты для чего-то, что вы можете вызвать, вместо пакетной логики:

Это приложение .NET, которое вы перетаскиваете в% Systemroot% и вызываете так же, как и любую другую команду в пакете, .bat, .cmd и т.д. 1

Использование выглядит так: Обратное "C:\Path\File.txt"

И да, мне принадлежит вещь. Мне кажется, это проще назвать, чем выписать логику. Он заменит содержимое файла, по крайней мере, на данный момент, и не создаст второй файл.

1

sort /r yourfile.txt> out.txt

Это выведет все строки в yourfile.txt в обратном алфавитном порядке. Обратите внимание, что это может отличаться от размещения всех строк в yourfile.txt в обратном порядке.

-1

ровно 10 строк perl, учитывая, что ничего не будет сделано, если выходной файл уже существует:

#!/usr/bin/perl
usage() if( !$ARGV[0] );
my $f_out = my $f_in = $ARGV[0];
$f_out =~ s/(\..{1,3})?$/.reverse$1/i;
open(TXTIN, "<$f_in") || usage("Can't read file [$f_in]");
my @in = <TXTIN>; close(TXTIN);
usage( "File already exists, nothing done [$f_out]" ) if( -e $f_out );
open(TXTOUT, ">$f_out"); print TXTOUT join( '', reverse( @in ) ); close(TXTOUT);
print "File reverse written [$f_out]\n";
sub usage { print "$_[0]\nUsage: [perl] rev2.pl (filename)\n"; exit; }

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .