[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 【已解决】批量提取N个文本的任意行内容??

本帖最后由 屡败屡战 于 2017-12-25 12:34 编辑

我想求批处理代码,可以实现以下操作
1、批量提取某文件夹下N个文本的任意行内容,任意行的行数不确定,行数最好由自己定(请在代码中注明如何修改行数),输出结果到另一新文本文件中(输出结果.txt)
2、最好输出文件名,作为标识,即在输出结果中,其左列为文件名,右列为提取的任意行的内容

我在网上搜索,有些代码只能输出指定行的内容,但不能输出文件名,望大神门不吝赐教!!

  1. @echo off
  2. echo,>输出结果.txt
  3. for /f "delims=" %%a in ('dir /b *.txt') do (
  4.     call :get_line "%%a"
  5. )
  6. goto :EOF
  7. more +2 就是获取第3行的内容
  8. :get_line file
  9. for /f "delims=" %%b in ('more +2 %1') do (
  10.     echo %1 %%b >>输出结果.txt
  11.     goto :EOF
  12. )
复制代码
2

评分人数

#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

ivor 老师,代码很完美,但还有事求,刚才忘了说,这个文件夹下还有其它子文件夹,不知道这种提取“子文件夹”下的代码,该如何写,其它的与上面说的一样,麻烦了!!

TOP

回复 3# 屡败屡战


第三行dir后面加上/s即可:    ('dir /s /b *.txt')
#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

老师辛苦了,我有5、6万的文本文件,我要测下速度。
另外,望老师提供有关批处理的学习网址,我想学习下

TOP

本帖最后由 ivor 于 2017-12-17 13:15 编辑

回复 5# 屡败屡战


    论坛里面有很多教程
-Totalcount 3 表示读取三行
powershell:
  1. dir *.txt -Recurse -Exclude "输出结果.txt"| %{if (Get-Content "$_" -Totalcount 3){-JOIN($_," ",(Get-Content "$_" -Totalcount 3)[-1])}} | sc 输出结果.txt
复制代码
7818个文本382M测试结果:

powershell:8秒

2017年12月17日 13:04:16
2017年12月17日 13:04:24

bat:6分钟
13:04:54.53
13:10:25.92
#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

本帖最后由 屡败屡战 于 2017-12-18 08:52 编辑

这是我找到的批处理代码,其操作是将文本文件,每隔固定行插入一行內容(支持多个文本文件)
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /b *.txt') do (
    set line=0
    (for /f "eol= delims=" %%i in (%%~sa) do (
        set /a line+=1
        echo %%i
        if !line! equ 70 echo 插入内容
        if !line! equ 37 echo 插入内容
        if !line! equ 30 echo 插入内容
        if !line! equ 20 echo 插入内容
        if !line! equ 10 echo 插入内容
        if !line! equ 8 echo 插入内容
        if !line! equ 7 echo 插入内容
    ))>$
    move /y $ "%%~a"
)


执行后的效果:(但是这不是我想要的)

【3】 4446
【4】 4447
【5】 4448
【6】 4449
【7】 4450
插入内容
【8】 4451
插入内容
【9】 4452
【10】 4453
插入内容
【11】 4454
【12】 4455


而我想要的效果:

【7】 4450
插入内容 【8】 4451
【9】 4452
插入内容 【10】 4453
【11】 4454
【12】 4455
插入内容 【13】 4456
【14】 4457
插入内容 【15】 4458
【16】 4459
【17】        4460
【18】        4461
【19】        4462
【20】        4463

我的想法是“插入的內容”直接在插入原文档段落的行首之前,而不是插入后再另起一行,我试着改了改,均以失败告终,望老师帮帮忙?? 在源代码上改一改。能实现我的要求。

TOP

回复 7# 屡败屡战
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /b *.txt') do (
  4.     set line=0
  5.     (for /f "eol= delims=" %%i in (%%~sa) do (
  6.         set /a line+=1
  7.         
  8.         if !line! equ 70 (echo 插入内容 %%i) else (if !line! equ 37 (echo 插入内容 %%i) else (if !line! equ 30 (echo 插入内容 %%i) else (if !line! equ 20 (echo 插入内容 %%i) else (if !line! equ 20 (echo 插入内容 %%i) else (if !line! equ 10 (echo 插入内容 %%i) else (if !line! equ 8 (echo 插入内容 %%i) else (if !line! equ 7 (echo 插入内容 %%i) else (echo %%i))))))))   
  9.     ))>$
  10.     move /y $ "%%~a"
  11. )
复制代码
#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

老师辛苦了。代码改的完美。
我有个疑问: powershell:代码
dir *.txt -Recurse -Exclude "输出结果.txt"| %{if (Get-Content "$_" -Totalcount 3){-JOIN($_," ",(Get-Content "$_" -Totalcount 3)[-1])}} | sc 输出结果.txt
我把此代码粘贴到txt,另存为测试.ps1,
我用“C:\Windows\System32\powershell.exe”打开此测试.ps1,系统显示无法加载,我搞不懂??望老师指示一下,
我的是win7 32位系统

TOP

本帖最后由 ivor 于 2017-12-18 14:23 编辑

回复 9# 屡败屡战

和TXT文件放到一个目录,保存后缀.cmd,双击运行
  1. <# :
  2. @echo off
  3. rem 增强代码兼容性,代码保存为 ".bat"、".cmd"、".ps1"均可执行
  4. powershell Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
  5. more +8 %~f0 > %~dpn0.ps1
  6. powershell %~dpn0.ps1
  7. del %~dpn0.ps1&pause&exit /b
  8. #>
  9. -JOIN("开始时间:",(get-date))
  10. dir *.txt -Recurse -Exclude "输出结果.txt"| %{if (Get-Content "$_" -Totalcount 3){-JOIN($_," ",(Get-Content "$_" -Totalcount 3)[-1])}} | sc 输出结果.txt
  11. -JOIN("结束时间:",(get-date))
复制代码
#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

本帖最后由 屡败屡战 于 2017-12-18 16:27 编辑

老师好,能否再帮帮忙?
【问题1】
我有很多txt文件,但是关键词不在文件名,而是在txt文件内容里面,批处理如何按照输入的关键词搜索出含有该关键词的txt文件,移动到其它文件夹。

另外关键词有很多,记录在关键词列表里,每行一个关键字,命名为a.txt。我想依据a.txt的关键词,将当前文件夹下(含子文件夹)里的含关键词的txt文件提取出来,移动到其它文件夹(就是以关键词命名文件夹)。这个对我来说很难,能否帮帮忙?


【问题2】
我有大量文本文件,其中內容含大量无用词组,我准备一个“关键词列表.txt”文件,里面有准备删除的关键字,每行一个关键字。
我想执行操作:
      1、要求在同文件夹下(包括子文件夹)里所有文本文件执行操作,删除其与关键词列表.txt文件相符合的关键词,批处理命令该如何写?
      2、延伸一下,如果是批量删除含这些关键饲的“行”,那又该如何操作。

TOP

如果只替换关键字,建议用notepad++

问题1:.
  1. @echo off
  2. rem 关键字.txt请放至批处理的上层目录
  3. rem 匹配到的文件会移动到上层关键字目录
  4. for /f "delims=" %%a in (..\关键字.txt) do (
  5.     echo %%a:
  6.     for /f "delims=" %%b in ('findstr /m /s "%%a" *.txt') do (
  7.         rem 如果有匹配的文件则执行下面
  8.         md ..\%%a 2>nul
  9.         echo %%b
  10.         move "%%b" "..\%%a\"
  11.     )
  12. )
  13. pause
复制代码
回复 11# 屡败屡战


问题2-2.
  1. @echo off
  2. rem 删除上层目录new
  3. rd ..\new /s /q
  4. for /f "delims=" %%a in (..\关键字.txt) do (
  5.     echo %%a
  6.     md ..\new >nul
  7.     for /f "tokens=1,2* delims=:" %%b in ('findstr /v /s "%%a" *.txt') do (
  8.         rem 过滤关键词的行,保存位置上层目录new
  9.         echo,%%c >>"..\new\%%~nxb"
  10.         pause
  11.     )
  12. )
  13. pause
复制代码
#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

老师,万分感谢,我都不知该如何感激了!!
老师:我想咨询下,文本文件的标题在文档内容中默让向左对齐,让人浏览恨不舒服,不知遒能否让文档标题居中,像word文档中那样标题是居中的(有居中按钮的),不知道老师有没有什么好的建议??

TOP

TXT 文件右边界没有限制,谈何居中。只能前面加 制表符和空格,加多少还要看自己实际情况
#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

老师,如何能在论坛联系到老师,或QQ号、微信什么的,我万分恳求,不知道能否满足我的愿望

TOP

返回列表