Board logo

标题: [文本处理] [已解决]批处理从1.csv中取出.txt、.ini、.bat、.vbs的完整路径(含扩展名) [打印本页]

作者: yyz219    时间: 2022-9-20 08:47     标题: [已解决]批处理从1.csv中取出.txt、.ini、.bat、.vbs的完整路径(含扩展名)

从1.csv中取出.txt、.ini、.bat、.vbs的完整路径(含扩展名),保存为1.txt
完美解决了:
  1. @echo off
  2. (for /f "delims=" %%i in ('findstr "\.txt \.ini \.bat \.vbs" 1.csv') do (
  3.     for /f tokens^=17^ delims^=^" %%j in (%%i) do (
  4.         for /f "delims=-" %%k in ("%%j") do echo,%%k
  5.     )
  6. ))>1.txt
复制代码
pause[/code]*****************************************************************
下面是不能正确输出的1.csv
https://pan.baidu.com/s/1D0-KYijTpeT6mD2UXB3r-g
作者: hfxiang    时间: 2022-9-20 09:35

试一下如下指令
  1. for /f "tokens=1* delims=." %a in ('findstr /i "\<.*.exe" 1.txt') do @where %~a.exe
复制代码

作者: yyz219    时间: 2022-9-20 09:37

试一下如下指令
hfxiang 发表于 2022-9-20 09:35



    我试一试先,辛苦了
作者: yyz219    时间: 2022-9-20 09:42

试一下如下指令
hfxiang 发表于 2022-9-20 09:35



    不行,闪一下,也没有生成1.txt
作者: hfxiang    时间: 2022-9-20 09:53

回复 4# yyz219


2楼的指令在CMD窗口下执行,不是写在bat中执行,输入文件为1.txt,直接在屏幕上输出。

写在bat中执行的指令如下(以下指令提取的是.exe文件,其它的需自行改动):
  1. @rem 保存文件编码为ANSI
  2. @echo 执行中请等候......
  3. @(for /f "tokens=1* delims=." %%a in ('findstr /i "\<.*.exe" 1.csv') do @where "%%~a.exe")>1.txt 2>nul
  4. @echo
  5. @echo 执行完毕......
复制代码

作者: qixiaobin0715    时间: 2022-9-20 10:01

最好能在网盘中传一份CSV文件看看。
作者: yyz219    时间: 2022-9-20 10:32

本帖最后由 yyz219 于 2022-9-20 10:34 编辑
最好能在网盘中传一份CSV文件看看。
qixiaobin0715 发表于 2022-9-20 10:01



https://pan.baidu.com/s/1AhboSmHTB7sLigWmDFuppw
作者: yyz219    时间: 2022-9-20 10:43

本帖最后由 yyz219 于 2022-9-20 10:48 编辑
回复  yyz219


2楼的指令在CMD窗口下执行,不是写在bat中执行,输入文件为1.txt,直接在屏幕上输出。
...
hfxiang 发表于 2022-9-20 09:53



    我要提取的是文中粉红色的(这个是变化的)
作者: hfxiang    时间: 2022-9-20 10:55

回复 8# yyz219


   
直接在CMD窗口下试试如下指令:
  1. @(for /f "tokens=10 delims=," %a in (1.csv) do @for /f %b in ('echo %~a^|findstr /i ".txt .ini .bat .vbs"')  do @echo "%~b")>1.txt 2>nul
复制代码

作者: qixiaobin0715    时间: 2022-9-20 10:57

本帖最后由 qixiaobin0715 于 2022-9-20 11:16 编辑

回复 7# yyz219
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%x in (.txt .ini .bat .vbs) do set %%x=true
  4. (for /f "delims=" %%i in (1.csv) do (
  5.     for %%j in (%%i) do (
  6.         set str=%%j
  7.     )
  8.     for /f "delims=-" %%k in (!str!) do (
  9.         if defined %%~xk echo,%%k
  10.     )
  11. ))>1.txt
  12. pause
复制代码
看看显示是否正确
作者: yyz219    时间: 2022-9-20 11:13

回复  yyz219 看看显示是否正确
qixiaobin0715 发表于 2022-9-20 10:57



    屏幕能够正确显示

再麻烦一下,让它在生成1.txt

谢谢
作者: qixiaobin0715    时间: 2022-9-20 11:16

回复 11# yyz219
已修改
作者: yyz219    时间: 2022-9-20 11:20

回复  yyz219
已修改
qixiaobin0715 发表于 2022-9-20 11:16



    非常感谢,完美解决
作者: qixiaobin0715    时间: 2022-9-20 16:37

如果数据像你提供的那么规整的话,这样效率应当更高些:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%i in ('findstr "\.txt \.ini \.bat \.vbs" 1.csv') do (
  4.     for %%j in (%%i) do set str=%%j
  5.     for /f "delims=-" %%k in (!str!) do echo,%%k
  6. ))>1.txt
  7. pause
复制代码
未经测试。
作者: yyz219    时间: 2022-9-20 21:33

如果数据像你提供的那么规整的话,这样效率应当更高些:未经测试。
qixiaobin0715 发表于 2022-9-20 16:37



    非常感谢
作者: yyz219    时间: 2022-9-20 22:22

本帖最后由 yyz219 于 2022-9-21 01:33 编辑
如果数据像你提供的那么规整的话,这样效率应当更高些:未经测试。
qixiaobin0715 发表于 2022-9-20 16:37


如果文件路径中有 “!”号的时候,被过滤掉了,能不能修改一下

下面是不能正确输出的1.csv
https://pan.baidu.com/s/1D0-KYijTpeT6mD2UXB3r-g
作者: yyz219    时间: 2022-9-20 22:33

回复  yyz219


   
直接在CMD窗口下试试如下指令:
hfxiang 发表于 2022-9-20 10:55



    能够正确输出,麻烦修改为批处理

谢谢
作者: hfxiang    时间: 2022-9-21 08:23

for指令在命令行执行与批处理内执行,其两者之间的参数对应关系为:
在命令行用单百分号(%),如下:
  1. @(for /f "tokens=10 delims=," %a in (1.csv) do @for /f %b in ('echo %~a^|findstr /i ".txt .ini .bat .vbs"')  do @echo "%~b")>1.txt 2>nul
复制代码
在批处理用双百分号(%%),如下:
  1. @(for /f "tokens=10 delims=," %%a in (1.csv) do @for /f %%b in ('echo %%~a^|findstr /i ".txt .ini .bat .vbs"')  do @echo "%%~b")>1.txt 2>nul
复制代码

作者: yyz219    时间: 2022-9-21 08:25

for指令在命令行执行与批处理内执行,其两者之间的参数对应关系为:
在命令行用单百分号(%),如下:在批 ...
hfxiang 发表于 2022-9-21 08:23


非常感谢
作者: yyz219    时间: 2022-9-21 08:58

for指令在命令行执行与批处理内执行,其两者之间的参数对应关系为:
在命令行用单百分号(%),如下:在批 ...
hfxiang 发表于 2022-9-21 08:23



    你这些代码比主楼的慢一些,能不能加快一点(或者修改一下主楼的代码,使它支持“!”号)

谢谢
作者: flashercs    时间: 2022-9-21 10:08

本帖最后由 flashercs 于 2022-9-21 10:14 编辑
  1. 0<1/*,:
  2. @echo off
  3. cd /d "%~dp0"
  4. cscript -nologo -e:jscript "%~f0" "1.csv" "1.txt"
  5. pause
  6. exit /b
  7. */;
  8. if (WScript.Arguments.length < 2) WScript.Quit();
  9. var fso = new ActiveXObject('Scripting.FileSystemObject');
  10. var re = /(?:")([^"]*\.(?:txt|ini|bat|vbs))[^"]*"$/igm;
  11. try {
  12.   var tsread = fso.OpenTextFile(WScript.Arguments(0), 1, false, -2);
  13.   var str = tsread.ReadAll();
  14.   tsread.Close();
  15.   var tswrite = fso.OpenTextFile(WScript.Arguments(1), 2, true, -2);
  16.   var arr;
  17.   while (null != (arr = re.exec(str))) {
  18.     tswrite.WriteLine(arr[1]);
  19.   }
  20.   tswrite.Close();
  21. } catch (e) {
  22. }
复制代码

作者: qixiaobin0715    时间: 2022-9-21 10:16

回复 16# yyz219
那就去掉变量延迟:
  1. @echo off
  2. (for /f "delims=" %%i in ('findstr "\.txt \.ini \.bat \.vbs" 1.csv') do (
  3.     for /f tokens^=17^ delims^=^" %%j in (%%i) do (
  4.         for /f "delims=-" %%k in ("%%j") do echo,%%k
  5.     )
  6. ))>1.txt
  7. pause
复制代码

作者: yyz219    时间: 2022-9-21 10:32

回复  yyz219
那就去掉变量延迟:
qixiaobin0715 发表于 2022-9-21 10:16



    辛苦了 谢谢
作者: yyz219    时间: 2022-9-21 10:37

回复  yyz219
那就去掉变量延迟:
qixiaobin0715 发表于 2022-9-21 10:16



    非常成功,非常感谢
作者: hfxiang    时间: 2022-9-21 10:42

本帖最后由 hfxiang 于 2022-9-21 10:45 编辑

回复 20# yyz219


   
如果想快,建议用第3方式具gawk( http://bcn.bathome.net/tool/4.1.3/gawk.exe
  1. @(for /f "delims=" %%a in ('gawk -F"," "$10~/\.txt/||/\.ini/||/\.bat/||/\.vbs/{print $10}" 1.csv') do @for /f "delims=-" %%b in (%%a) do @echo %%b)>1.txt 2>nul
复制代码

作者: yyz219    时间: 2022-9-21 11:06

回复  yyz219


   
如果想快,建议用第3方式具gawk(  )
hfxiang 发表于 2022-9-21 10:42


又多了一种方法,谢谢
作者: qixiaobin0715    时间: 2022-9-24 09:51

22楼代码化简为:
  1. @echo off
  2. (for /f tokens^=17^ delims^=^" %%j in ('findstr "\.txt \.ini \.bat \.vbs" 1.csv') do (
  3.     for /f "delims=-" %%k in ("%%j") do echo,%%k
  4. ))>1.txt
  5. pause
复制代码

作者: qixiaobin0715    时间: 2022-9-24 10:05

如果文件扩展名都是4个字符(包括.),用一个for循环+变量延迟即可:
  1. @echo off
  2. for /f tokens^=17^ delims^=^" %%j in ('findstr "\.txt \.ini \.bat \.vbs" 1.csv') do (
  3.     if "%%j"=="%%~fj" (
  4.         set "Filen=%%~dpnj"
  5.     ) else (
  6.         set "Filen=%%~nj"
  7.     )
  8.     set "Extn=%%~xj"
  9.     setlocal enabledelayedexpansion
  10.     echo,!Filen!!Extn:~,4!
  11.     endlocal
  12. )
  13. pause
复制代码
这个可以忽略,主要是自己想练练手。
作者: yyz219    时间: 2022-9-24 13:16

如果文件扩展名都是4个字符(包括.),用一个for循环+变量延迟即可:这个可以忽略,主要是自己想练练手。
qixiaobin0715 发表于 2022-9-24 10:05



     乐于助人




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