找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: yunyan100

[其他] 批处理如何在txt中的每一行从下往上读取?

[复制链接]
发表于 2019-1-12 22:36:50 | 显示全部楼层
回复 15# WHY

我认为这是正常的。你所有的行的字符数小于 65535。就会以默认的排序。如果有部分行的字符数超过 +n ,不足+n的行会以空字符补足再排序。
 楼主| 发表于 2019-1-13 11:14:09 | 显示全部楼层
回复 2# ivor


powershell好像不错,好像使用比批处理长点时间?你可否改下增加文件或文件夹,我本意就是选择一个文件或文件夹如果有一些字符,不仅删除字还要改文件或文件夹.
 楼主| 发表于 2019-1-13 11:20:13 | 显示全部楼层
回复 14# 523066680
我想也是,我是老江湖了,习惯了批处理,powershell如果在批处理上感觉运行慢慢一点,是不是?
发表于 2019-1-13 11:55:55 | 显示全部楼层
本帖最后由 523066680 于 2019-1-13 12:30 编辑

回复 18# yunyan100

    这都是看你的情况需求。对我们来说,没什么好考虑的,ruby python perl 哪一个处理这种问题都是一两句代码的事。
发表于 2019-1-14 08:30:50 | 显示全部楼层
回复 16# xczxczxcz


    建议你在 win7 和 win10系统中,分别测试一下 sort /+65535
发表于 2019-1-15 09:05:42 | 显示全部楼层
bash环境下的cat的反序   tac  了解一下?
  1. tac 1.txt
复制代码
坛子里的windows下的第三方也有的下载。
发表于 2019-1-15 09:53:31 | 显示全部楼层
test.bat
  1. @echo off
  2. powershell -c "$s=gc 1.txt;[array]::Reverse($s);$s"
复制代码
发表于 2019-1-15 14:53:25 | 显示全部楼层
本帖最后由 523066680 于 2019-1-16 16:25 编辑

same same
  1. use File::Slurp;
  2. write_file("dst.txt", reverse(read_file("src.txt")));
复制代码
但是怎么能满足于此,不如假设文件大于10G,练练手吧。

tac.exe 测试超过3GB的文件,没有输出。

实践了,先用Perl试手,实测 3.0GB文件 70s,机械硬盘(蓝色标签)。
  1. =info
  2.     文本按行倒序输出
  3.     523066680/vicyang
  4.     2019-01
  5. =cut

  6. use strict;
  7. use Fcntl qw(:seek);
  8. STDOUT->autoflush(1);
  9. my $src = "F:/A_Parts.txt";
  10. my $dst = $src;
  11. $dst =~s/(\.\w+)$/_REV$1/;

  12. reverse_write( $src, $dst );

  13. sub reverse_write
  14. {
  15.     my ($srcfile, $dstfile) = @_;
  16.     open my $SRC, "<:raw", $srcfile or die "$!\n";
  17.     open my $DST, ">:raw", $dstfile or die "$!\n";

  18.     # 缓冲区大小
  19.     my $buffsize = 2**16;
  20.     my $offset = -s $SRC;
  21.     my $buff;
  22.     my @lines;
  23.     my $left = "";
  24.     while ( $offset >= $buffsize )
  25.     {
  26.         $offset -= $buffsize;
  27.         seek $SRC, $offset, SEEK_SET;
  28.         read $SRC, $buff, $buffsize;
  29.         # 拼接,考虑单行文本小于 $buffsize 的情况
  30.         $buff = $buff . $left;
  31.         if ( $buff =~/\r?\n/ ) {
  32.             @lines = reverse( split /\r?\n/, $buff, -1 );
  33.             $left = pop @lines;
  34.             printf $DST "%s\r\n", join("\r\n", @lines);
  35.         } else {
  36.             $left = $buff;
  37.             #printf "%s\n", $left;
  38.         }
  39.     }

  40.     # 如果 offset 未归零,读取剩下(源文件的开头)部分
  41.     return if ($offset <= 0);
  42.     seek $SRC, 0, SEEK_SET;
  43.     read $SRC, $buff, $offset;
  44.     @lines = reverse(split /\r?\n/, $buff .$left );
  45.     print $DST join("\r\n", @lines);
  46.     close $SRC;
  47.     close $DST;
  48. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 01:15 , Processed in 0.018953 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表