Board logo

标题: [文件操作] 批处理如何将txt文本的文件名添加/插入到文本中每一行的行首/开头? [打印本页]

作者: mydreamspace    时间: 2016-6-27 15:13     标题: 批处理如何将txt文本的文件名添加/插入到文本中每一行的行首/开头?

本帖最后由 pcl_test 于 2016-7-10 23:48 编辑

操作系统win10;
手上有多个txt文件,内部数据比较多,需要将txt文件名加到各txt内每行行首,添加进去的文件名与原行的正文用空格或逗号隔开。
作者: GNU    时间: 2016-6-27 15:45

  1. @echo off
  2. for %%i in (*.txt) do (
  3.     sed -i "s/^/%%i /" "%%i"
  4. )
复制代码

作者: mydreamspace    时间: 2016-6-27 15:59

回复 2# GNU


    报错啊。。。
'sed' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'sed' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
作者: mydreamspace    时间: 2016-6-27 16:02

回复 2# GNU


    我的是windows系统
作者: mydreamspace    时间: 2016-6-27 16:07

本帖最后由 mydreamspace 于 2016-6-28 14:37 编辑

将txt的文件名(不含后缀)添加到txt内每行行首,并加一个空格或者逗号隔开。
目前用的处理太慢


@echo off
dir .\*.txt /b/a-d>names.def
for /f "delims=" %%a in (names.def) do (
   for /f "usebackq delims=" %%b in ("%%a") do (
      set "var=%%b"
      setlocal enabledelayedexpansion   
      echo %%~na %%b
      endlocal
   )>>#
   move # "%%a"  
)
pause
作者: GNU    时间: 2016-6-27 16:09

回复 3# mydreamspace


下载地址:
http://bbs.bathome.net/s/tool/index.html?key=sed
作者: GNU    时间: 2016-6-27 16:12

echo %%~na %%b %%~na
改成
echo %%~na %%b
这样就不会往行尾也添加了文件名
作者: mydreamspace    时间: 2016-6-27 16:13

本帖最后由 pcl_test 于 2016-6-27 22:47 编辑

回复 5# GNU
这个是要自己扩展吗?有没有windows自身就可以实现的啊?
我现在用的这个处理起来有点慢。。
作者: mydreamspace    时间: 2016-6-27 16:14

回复 2# GNU


    嗯嗯,是的
主要是有点慢,处理的文件多啊
作者: codegay    时间: 2016-6-27 16:28

本质是同一个问题。想同问题不要一贴多发。
以及提问前搜索。
作者: mydreamspace    时间: 2016-6-27 16:57

回复 4# codegay


好的,
搜索过了,
本质是一个问题,这个我注意下。
作者: shootman2    时间: 2016-6-27 21:17

可以把
setlocal enabledelayedexpansion   
endlocal
放在外面,这样避免每次打开又关闭
@echo off&setlocal enabledelayedexpansion   
dir .\*.txt /b/a-d>names.def
for /f "delims=" %%a in (names.def) do (
   for /f "usebackq delims=" %%b in ("%%a") do (
      set "var=%%b"  
      echo %%~na %%b
   )>>#
   move # "%%a"  
)
endlocal
pause
作者: mydreamspace    时间: 2016-6-28 13:22

回复 12# shootman2


    还是有点慢,不过这样还是有效果的,速度提高了一倍,原先差不多3-4秒一个文件,现在1-2秒左右了
作者: jrx401    时间: 2016-6-28 23:37

本帖最后由 pcl_test 于 2016-6-29 02:14 编辑

我这个菜鸟写的。
不过文件名会变成  [原文件名]_1.txt

[bat码]:
  1. echo AddFileNametoCol1
  2. echo ---------------------------------
  3. :: Step1, Catch all txt file and save to namelist.txt
  4. if exist namelist.txt del namelist.txt
  5. if exist namelist.lst del namelist.lst
  6. for %%i in (*.txt) do echo %%i>>namelist.lst
  7. cd.>namelist.txt
  8. for /f "tokens=1,2  delims=." %%J in (namelist.lst) do echo %%J >>namelist.txt
  9. del namelist.lst
  10. :: Step2, add file name to collumn 1
  11. setlocal enabledelayedexpansion
  12. for /f %%C in (namelist.txt) do (
  13.         set n=0
  14.         for /f "delims=" %%a in (%%C.txt) do (
  15.             echo %%C,%%a>>%%C_1.txt
  16. )
  17. )
  18. del namelist.txt
  19. pause
复制代码

作者: WHY    时间: 2016-6-29 18:49

  1. gawk "{s=substr(FILENAME,1,length(FILENAME)-4); print s,$0>s\".Log\"}" *.txt
复制代码

作者: pcl_test    时间: 2016-6-29 22:04

  1. //&cls&dir /a-d/b *.txt|cscript -nologo -e:jscript "%~f0"&pause&exit
  2. var fso = new ActiveXObject('Scripting.Filesystemobject');
  3. var txtfiles = WSH.StdIn.ReadAll().split(/\r\n/);
  4. for(var i = 0; i<txtfiles.length; i++){
  5.     var filename = fso.GetFile(txtfiles[i]).Name.replace(/\.[^\.]+$/, '');
  6.     var f = fso.OpenTextFile(txtfiles[i], 1);
  7.     var txt = f.ReadAll().replace(/(^|\r?\n)(?!(\r?\n|$))/g, '$&'+filename+',');
  8.     f.Close();
  9.     var f = fso.OpenTextFile(txtfiles[i], 2);
  10.     f.Write(txt);
  11.     f.Close();
  12. }
  13. WSH.echo('Done');
复制代码

作者: mydreamspace    时间: 2016-6-30 13:01

回复 15# WHY


    一闪而过,然后好像什么都没发生
作者: mydreamspace    时间: 2016-6-30 13:04

回复 14# jrx401


    可以,不过比原先的没快多少。。
作者: mydreamspace    时间: 2016-6-30 13:07

回复 16# pcl_test


    这速度好恐怖。。拿一百多个txt试了下,刚点开就转换好了。。。
作者: jrx401    时间: 2016-7-1 22:38

回复 12# shootman2


    果然很简洁。
     如下两个没有见过, 可否给解释一下呢?
     >>#
    move # "%%a"
作者: jrx401    时间: 2016-7-1 22:41

回复 16# pcl_test


      看不懂 Code。
     想要看懂,我要参考什么样的资料呢?
作者: WHY    时间: 2016-7-2 01:19

回复 20# jrx401


    >> 是重定向符,#是文件名,move在这里是把#文件重命名
这样可能会好一点:
  1. @echo off
  2. for %%a in (*.txt) do (
  3.    (for /f "usebackq delims=" %%b in ("%%a") do (
  4.       echo %%~na %%b
  5.    ))>"%%~na.Log"
  6. )
复制代码

作者: WHY    时间: 2016-7-2 01:23

  1. @if (0)==(0) echo off
  2. dir /b *.txt | cscript //nologo //e:jscript "%~f0"
  3. pause & exit
  4. @end
  5. var getContent = function(strFile){
  6.     var strName = fso.GetBaseName(strFile);
  7.     var objFile = fso.OpenTextFile(strFile, 1);
  8.     var s = objFile.ReadAll().replace(/[^\r\n]+/g, strName + ' $&');
  9.     objFile.Close();
  10.     fso.OpenTextFile(strName + '.Log', 2, true).Write(s)
  11. }
  12. var fso = new ActiveXObject('Scripting.FileSystemObject');
  13. while(!WSH.StdIn.AtEndOfStream){getContent(WSH.StdIn.ReadLine());}
复制代码

作者: qixiaobin0715    时间: 2018-7-30 00:03

回复 16# pcl_test
若想把文件名放到行尾,并将所有文件合并为一个新文件,如何改动?




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