标题: [其他] 批处理如何在txt中的每一行从下往上读取? [打印本页]
作者: yunyan100 时间: 2019-1-12 09:18 标题: 批处理如何在txt中的每一行从下往上读取?
各位好,又要请教下,txt文本中,有没有从下往上读取txt方式,如:
txt- "F:\Downloads\201812130355_LeboPCCast_3_11_05_Release"
- "F:\Downloads"
- "F:\"
复制代码
从txt中读取后每行写到变量,谢谢- "F:\"
- "F:\Downloads"
- "F:\Downloads\201812130355_LeboPCCast_3_11_05_Release"
复制代码
作者: ivor 时间: 2019-1-12 10:23
本帖最后由 ivor 于 2019-1-12 10:44 编辑
- $lines=gc a.txt;[array]::Reverse($lines);$lines
复制代码
你好,这应该不是windows批处理的吧?现在的批处理for能从txt中从上往下,如果for能从下往上也行
yunyan100 发表于 2019-1-12 10:29
如果要在批处理里面运行只需变通一下就可以了,bat+powershell混编兼容性很好的↓↓↓- powershell -command " & {$lines=gc a.txt;[array]::Reverse($lines);$lines}"
复制代码
作者: yunyan100 时间: 2019-1-12 10:29
ivor 发表于 2019-1-12 10:23
你好,这应该不是windows批处理的吧?现在的批处理for能从txt中从上往下,如果for能从下往上也行
作者: yunyan100 时间: 2019-1-12 10:55
回复 2# ivor
powershell一般不用
作者: happy886rr 时间: 2019-1-12 15:07
这有何难- @echo off
- for /f %%a in ('findstr/n ".*" a.txt^|sort/r') do (
- set "line=%%a"
- setlocal enabledelayedexpansion
- echo;!line:*:=!
- endlocal
- )
- pause
复制代码
作者: happy886rr 时间: 2019-1-12 15:53
本帖最后由 happy886rr 于 2019-1-12 16:11 编辑
回复 2# ivor
这都被你发现了,只是哄哄他,估计他的变量也不会超过9个。
我赌他用不了那么多路径。复制代码
作者: 523066680 时间: 2019-1-12 17:08
本帖最后由 523066680 于 2019-1-12 17:12 编辑
如果这个路径名单都是 一个目录树下的所有子目录,
那可能直接 sort xxx.txt 就可以?(仅针对这种情况处理,不通用)- >sort xxx.txt
- "F:\"
- "F:\Downloads"
- "F:\Downloads\201812130355_LeboPCCast_3_11_05_Release"
复制代码
作者: yunyan100 时间: 2019-1-12 17:31
本帖最后由 yunyan100 于 2019-1-12 17:33 编辑
感谢你们好,路径长度不确定,有根目录到下面若干,5楼9个基本可以但可能超过,我改下但不适用- for /f %%a in ('findstr/n ".*" 1.txt^|sort/r') do (
- set "pa=%%a"
- setlocal enabledelayedexpansion
- set "pa=!pa:"=!"
- echo "!pa:*:=!")>>1.txt&endlocal
- pause
复制代码
我下面发的是我在用,只是目前改进.文件夹或文件,要删除有"()&",通过"cd.."路径都可以- cd /d "%pa%" >nul 2>nul
- :uacc
- for %%a in ("%cd%") do echo %%a>>%dp%\1.txt
- dir/ad "%cd%\" >nul 2>nul&&cd..&&goto :uacc
- for /f "delims=" %%a in (%dp%\1.txt) do (setlocal enabledelayedexpansion&for %%i in (%%a) do (set "pay=%%~nxi"
- set "pay=!pay:(=!"
- set "pay=!pay:)=!"
- set "pay=!pay:&=!"
- set "pay=!pay: =!"
- ren %%i "!pay!" >nul 2>nul))&endlocal&del %dp%\1.txt >nul 2>nul
- if "%ee%"=="e" set "pac=%pa%"
- if "%ee%"=="e" set "pa=%pa%\%paa%"
- if "%ee%"=="e" set "paa=%paa:&=%"
- if "%ee%"=="e" set "paa=%paa:(=%"
- if "%ee%"=="e" set "paa=%paa:)=%"
- if "%ee%"=="e" ren "%pa%" "%paa%"
复制代码
作者: ivor 时间: 2019-1-12 19:01
- powershell -command " & {$lines=((gc a.txt) -replace '[()&\s]','');[array]::Reverse($lines);$lines|sc a.txt}"
复制代码
过滤 ()&空格
作者: happy886rr 时间: 2019-1-12 19:51
本帖最后由 happy886rr 于 2019-1-12 19:58 编辑
回复 8# yunyan100
sort/+1888就是答案,替换一下,多少个都能行。
另外过滤()&用sed就行。借助sed这1个第三方,你的要求都能达到。
实际上,这应该归属于批处理第三方问题,单纯依靠纯批处理是不擅长处理文本的,借助其他语言又会破坏批处理的粘合特性,只有第三方才能与批处理完美结合。
作者: WHY 时间: 2019-1-12 20:10
本帖最后由 WHY 于 2019-1-12 20:11 编辑
回复 10# happy886rr
悲催的是,Win7可以,Win10下 sort /+n这种办法失效了。
作者: yunyan100 时间: 2019-1-12 20:23
本帖最后由 yunyan100 于 2019-1-12 20:26 编辑
回复 10# happy886rr
批处理自已很行到能很,就是太麻烦些,这英语有点难,就是一文件夹或文件删除符号,且改过的也是传递变量
作者: xczxczxcz 时间: 2019-1-12 21:12
本帖最后由 xczxczxcz 于 2019-1-12 21:19 编辑
回复 11# WHY
开始以为是 more; 再看是说 SORT ,不过测试 win10 下: sort /+n 有效。 sort /+n xxxx /r 也有效。
作者: 523066680 时间: 2019-1-12 21:32
回复 11# WHY
到了win10就没理由不用 powershell 了吧
作者: WHY 时间: 2019-1-12 21:46
回复 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>
作者: xczxczxcz 时间: 2019-1-12 22:36
回复 15# WHY
我认为这是正常的。你所有的行的字符数小于 65535。就会以默认的排序。如果有部分行的字符数超过 +n ,不足+n的行会以空字符补足再排序。
作者: yunyan100 时间: 2019-1-13 11:14
回复 2# ivor
powershell好像不错,好像使用比批处理长点时间?你可否改下增加文件或文件夹,我本意就是选择一个文件或文件夹如果有一些字符,不仅删除字还要改文件或文件夹.
作者: yunyan100 时间: 2019-1-13 11:20
回复 14# 523066680
我想也是,我是老江湖了,习惯了批处理,powershell如果在批处理上感觉运行慢慢一点,是不是?
作者: 523066680 时间: 2019-1-13 11:55
本帖最后由 523066680 于 2019-1-13 12:30 编辑
回复 18# yunyan100
这都是看你的情况需求。对我们来说,没什么好考虑的,ruby python perl 哪一个处理这种问题都是一两句代码的事。
作者: WHY 时间: 2019-1-14 08:30
回复 16# xczxczxcz
建议你在 win7 和 win10系统中,分别测试一下 sort /+65535
作者: cfwyy77_bat 时间: 2019-1-15 09:05
bash环境下的cat的反序 tac 了解一下? 复制代码
坛子里的windows下的第三方也有的下载。
作者: Batcher 时间: 2019-1-15 09:53
test.bat- @echo off
- powershell -c "$s=gc 1.txt;[array]::Reverse($s);$s"
复制代码
作者: 523066680 时间: 2019-1-15 14:53
本帖最后由 523066680 于 2019-1-16 16:25 编辑
same same- use File::Slurp;
- write_file("dst.txt", reverse(read_file("src.txt")));
复制代码
但是怎么能满足于此,不如假设文件大于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;
- }
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |