Board logo

标题: [文本处理] 批处理如何将文件夹下所有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
  1. <# :
  2. @echo off
  3. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0' |Out-String|Invoke-Expression"
  4. pause
  5. #>
  6. $txts=ls -s *.txt
  7. 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
  1. gawk "BEGIN{print \"字段 1, 字段 2, 字段 3\"}{if(FNR>1){if($0~/^.*(,|,).+(,|,).*$/){print}}}" *.txt>con
复制代码

作者: qixiaobin0715    时间: 2022-10-13 08:36

没有文件样本,只能根据你提供的样式。可以换一个思路,排除含有相邻2个逗号的行:
  1. @echo off
  2. (echo,字段1,字段2,字段3
  3. for /d %%i in (*) do (
  4.     pushd "%%i"
  5.     type *.txt 2>nul|findstr /rv "字段1,字段2,字段3 ,,"
  6.     popd
  7. ))>out.txt
  8. 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

  1. @if (0)==(0) echo off
  2. title 保存为ANSI编码,处理ANSI编码的TXT文件
  3. for /d %%a in (*) do (pushd %%a
  4.     dir /b *.txt | cscript -nologo -e:jscript "%~0" >提取.log
  5. popd
  6. )
  7. pause&exit/b
  8. @end
  9. fso = new ActiveXObject("Scripting.FileSystemObject");
  10. while (!WSH.StdIn.AtEndOfStream) {
  11.     f = WSH.StdIn.ReadLine();
  12.     txt = fso.OpenTextFile(f,1).ReadAll().replace(/^[^,]+,(?!,,),.+[\r\n]*/mg,'');
  13.     log = txt.match(/^[^\r\n]+/mg).join('\r\n');
  14.     WScript.Echo(log)
  15. }
复制代码

作者: xslxslxsl    时间: 2022-10-14 22:02

回复 8# xp3000


    谢谢啦,看来我要好好消化
作者: xp3000    时间: 2022-10-14 22:17

去重复可以用这个
  1. @if (0)==(0) echo off
  2. title 保存为ANSI编码,处理ANSI编码的TXT文件
  3. for /d %%a in (*) do (pushd %%a
  4. cscript -nologo -e:jscript "%~f0" "a.txt" "b.txt">"提取.txt"
  5. popd
  6. )
  7. pause&exit/b
  8. @end
  9. var s = '', a = {}, files = WScript.Arguments;
  10. var fso = new ActiveXObject('Scripting.FileSystemObject');
  11. for (var i = 0; i<files.length; i++){
  12.     var f = fso.opentextfile(files(i), 1);
  13.     while(!f.AtEndOfStream){
  14.         var str = f.ReadLine();
  15.         var str = str.replace(/^[^,]+,(?!,,),.+$/mg,'');
  16.         if(!a[str]){
  17.             a[str] = 1;
  18.             s += str+'\r\n';
  19.         }
  20.     s = s.match(/^[^\r\n]+\r\n/mg).join('');
  21.     }
  22.     f.Close();
  23. }
  24. WSH.echo(s);
复制代码

作者: WHY    时间: 2022-10-14 23:27

本帖最后由 WHY 于 2022-10-15 14:37 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1* delims=:" %%i in ('findstr /s /b "[^,][^,]*,[^,][^,]*," *.txt') do (
  4.     if not defined s (
  5.         set "s=%%j"
  6.         echo;%%j
  7.     ) else if /i not "!s!" == "%%j" (
  8.         echo;%%j
  9.     )
  10. )) > new.Log
  11. pause
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2