标题: [文本处理] 批处理如何将文件夹下所有TXT文件,提取第二列不为空的数据行?谢谢! [打印本页]
作者: xslxslxsl 时间: 2022-10-12 18:44 标题: 批处理如何将文件夹下所有TXT文件,提取第二列不为空的数据行?谢谢!
在一个文件夹下有多个子文件夹,且每个子文件夹下有多个txt文件,每个txt文件字段结构相同,(如A.TXT、B.txt),现打算将所有txt中第二字段不为空的行提取到一个txt文件中,请大家指点一下,谢谢!
A.TXT
字段1,字段2,字段3
sdf,,hao好的
甲方,KKK,M乙方
arena,,d
……
B.TXT
字段1,字段2,字段3
A组,良好,
B组,车间一,M
C组,,优秀
……
提取到:提取.TXT
字段1,字段2,字段3
甲方,KKK,M乙方
A组,良好,
B组,车间一,M
……
作者: pd1 时间: 2022-10-13 02:01
本帖最后由 pd1 于 2022-10-13 02:03 编辑
回复 1# xslxslxsl - <# :
- @echo off
- powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0' |Out-String|Invoke-Expression"
- pause
- #>
- $txts=ls -s *.txt
- foreach($txt in $txts){gc $txt|%{$_ -match ".*?,.+,.*";$Matches.Values >>result.txt;$Matches=@()}}
复制代码
作者: hfxiang 时间: 2022-10-13 07:53
本帖最后由 hfxiang 于 2022-10-13 08:14 编辑
建议用gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )- gawk "BEGIN{print \"字段 1, 字段 2, 字段 3\"}{if(FNR>1){if($0~/^.*(,|,).+(,|,).*$/){print}}}" *.txt>con
复制代码
作者: qixiaobin0715 时间: 2022-10-13 08:36
没有文件样本,只能根据你提供的样式。可以换一个思路,排除含有相邻2个逗号的行:- @echo off
- (echo,字段1,字段2,字段3
- for /d %%i in (*) do (
- pushd "%%i"
- type *.txt 2>nul|findstr /rv "字段1,字段2,字段3 ,,"
- popd
- ))>out.txt
- pause
复制代码
bat文件存为ANSI编码。
作者: xslxslxsl 时间: 2022-10-13 08:51
回复 2# pd1
看不懂 ,不管怎么样,先谢谢,自己琢磨琢磨,谢谢了!
作者: xslxslxsl 时间: 2022-10-13 08:52
回复 3# hfxiang
谢谢,学习一下
作者: xslxslxsl 时间: 2022-10-13 08:57
回复 4# qixiaobin0715
谢谢指教,我试试看!
作者: xp3000 时间: 2022-10-13 10:03
- @if (0)==(0) echo off
- title 保存为ANSI编码,处理ANSI编码的TXT文件
- for /d %%a in (*) do (pushd %%a
- dir /b *.txt | cscript -nologo -e:jscript "%~0" >提取.log
- popd
- )
- pause&exit/b
- @end
-
- fso = new ActiveXObject("Scripting.FileSystemObject");
- while (!WSH.StdIn.AtEndOfStream) {
- f = WSH.StdIn.ReadLine();
- txt = fso.OpenTextFile(f,1).ReadAll().replace(/^[^,]+,(?!,,),.+[\r\n]*/mg,'');
- log = txt.match(/^[^\r\n]+/mg).join('\r\n');
- WScript.Echo(log)
- }
复制代码
作者: xslxslxsl 时间: 2022-10-14 22:02
回复 8# xp3000
谢谢啦,看来我要好好消化
作者: xp3000 时间: 2022-10-14 22:17
去重复可以用这个- @if (0)==(0) echo off
- title 保存为ANSI编码,处理ANSI编码的TXT文件
- for /d %%a in (*) do (pushd %%a
- cscript -nologo -e:jscript "%~f0" "a.txt" "b.txt">"提取.txt"
- popd
- )
- pause&exit/b
- @end
-
- var s = '', a = {}, files = WScript.Arguments;
- var fso = new ActiveXObject('Scripting.FileSystemObject');
- for (var i = 0; i<files.length; i++){
- var f = fso.opentextfile(files(i), 1);
- while(!f.AtEndOfStream){
- var str = f.ReadLine();
- var str = str.replace(/^[^,]+,(?!,,),.+$/mg,'');
- if(!a[str]){
- a[str] = 1;
- s += str+'\r\n';
- }
- s = s.match(/^[^\r\n]+\r\n/mg).join('');
- }
- f.Close();
- }
- WSH.echo(s);
复制代码
作者: WHY 时间: 2022-10-14 23:27
本帖最后由 WHY 于 2022-10-15 14:37 编辑
- @echo off
- setlocal enabledelayedexpansion
- (for /f "tokens=1* delims=:" %%i in ('findstr /s /b "[^,][^,]*,[^,][^,]*," *.txt') do (
- if not defined s (
- set "s=%%j"
- echo;%%j
- ) else if /i not "!s!" == "%%j" (
- echo;%%j
- )
- )) > new.Log
- pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |