返回列表 发帖

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

各位好,又要请教下,txt文本中,有没有从下往上读取txt方式,如:
txt
"F:\Downloads\201812130355_LeboPCCast_3_11_05_Release"
"F:\Downloads"
"F:\"COPY
从txt中读取后每行写到变量,谢谢
"F:\"
"F:\Downloads"
"F:\Downloads\201812130355_LeboPCCast_3_11_05_Release"COPY

本帖最后由 523066680 于 2019-1-16 16:25 编辑

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

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

实践了,先用Perl试手,实测 3.0GB文件 70s,机械硬盘(蓝色标签)。
=info
    文本按行倒序输出
    523066680/vicyang
    2019-01
=cut
use strict;
use Fcntl qw(:seek);
STDOUT->autoflush(1);
my $src = "F:/A_Parts.txt";
my $dst = $src;
$dst =~s/(\.\w+)$/_REV$1/;
reverse_write( $src, $dst );
sub reverse_write
{
    my ($srcfile, $dstfile) = @_;
    open my $SRC, "<:raw", $srcfile or die "$!\n";
    open my $DST, ">:raw", $dstfile or die "$!\n";
    # 缓冲区大小
    my $buffsize = 2**16;
    my $offset = -s $SRC;
    my $buff;
    my @lines;
    my $left = "";
    while ( $offset >= $buffsize )
    {
        $offset -= $buffsize;
        seek $SRC, $offset, SEEK_SET;
        read $SRC, $buff, $buffsize;
        # 拼接,考虑单行文本小于 $buffsize 的情况
        $buff = $buff . $left;
        if ( $buff =~/\r?\n/ ) {
            @lines = reverse( split /\r?\n/, $buff, -1 );
            $left = pop @lines;
            printf $DST "%s\r\n", join("\r\n", @lines);
        } else {
            $left = $buff;
            #printf "%s\n", $left;
        }
    }
    # 如果 offset 未归零,读取剩下(源文件的开头)部分
    return if ($offset <= 0);
    seek $SRC, 0, SEEK_SET;
    read $SRC, $buff, $offset;
    @lines = reverse(split /\r?\n/, $buff .$left );
    print $DST join("\r\n", @lines);
    close $SRC;
    close $DST;
}COPY
[url=][/url]

TOP

test.bat
@echo off
powershell -c "$s=gc 1.txt;[array]::Reverse($s);$s"COPY
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

bash环境下的cat的反序   tac  了解一下?
tac 1.txtCOPY
坛子里的windows下的第三方也有的下载。

TOP

回复 16# xczxczxcz


    建议你在 win7 和 win10系统中,分别测试一下 sort /+65535

TOP

本帖最后由 523066680 于 2019-1-13 12:30 编辑

回复 18# yunyan100

    这都是看你的情况需求。对我们来说,没什么好考虑的,ruby python perl 哪一个处理这种问题都是一两句代码的事。
[url=][/url]

TOP

回复 14# 523066680
我想也是,我是老江湖了,习惯了批处理,powershell如果在批处理上感觉运行慢慢一点,是不是?

TOP

回复 2# ivor


powershell好像不错,好像使用比批处理长点时间?你可否改下增加文件或文件夹,我本意就是选择一个文件或文件夹如果有一些字符,不仅删除字还要改文件或文件夹.

TOP

回复 15# WHY

我认为这是正常的。你所有的行的字符数小于 65535。就会以默认的排序。如果有部分行的字符数超过 +n ,不足+n的行会以空字符补足再排序。

TOP

回复 13# xczxczxcz


    我说的不准确,sort /+n n的值很小可以,n 的值为一个大数值不行(将文本倒序)。我记得好像在 win10 v1803 版本测试就没通过。
Microsoft Windows [版本 10.0.17763.194]
(c) 2018 Microsoft Corporation。保留所有权利。

C:\Users\WHY>cd /d e:\Test

e:\Test>type 1.txt
1
2
3
4
5
6
7
8
9
10
e:\Test>sort /+65535 1.txt
1
10
2
3
4
5
6
7
8
9

e:\Test>
1

评分人数

    • CrLf: 发现大坑技术 + 1

TOP

回复 11# WHY
到了win10就没理由不用 powershell 了吧
[url=][/url]

TOP

本帖最后由 xczxczxcz 于 2019-1-12 21:19 编辑

回复 11# WHY

开始以为是 more; 再看是说 SORT ,不过测试 win10 下: sort /+n 有效。 sort /+n xxxx /r 也有效。

TOP

本帖最后由 yunyan100 于 2019-1-12 20:26 编辑

回复 10# happy886rr


    批处理自已很行到能很,就是太麻烦些,这英语有点难,就是一文件夹或文件删除符号,且改过的也是传递变量

TOP

本帖最后由 WHY 于 2019-1-12 20:11 编辑

回复 10# happy886rr


    悲催的是,Win7可以,Win10下 sort /+n这种办法失效了。

TOP

本帖最后由 happy886rr 于 2019-1-12 19:58 编辑

回复 8# yunyan100
sort/+1888就是答案,替换一下,多少个都能行。
另外过滤()&用sed就行。借助sed这1个第三方,你的要求都能达到。
实际上,这应该归属于批处理第三方问题,单纯依靠纯批处理是不擅长处理文本的,借助其他语言又会破坏批处理的粘合特性,只有第三方才能与批处理完美结合。

TOP

返回列表