【问题标题】:Find " - " in TXT file and switch before with after and vice versa在TXT文件中找到“-”,前后切换,反之亦然
【发布时间】:2018-07-15 12:49:32
【问题描述】:

我有一个文本文件,其中包含按作者排序的书籍列表,名为author.txt。我想从author.txt 列表文件中创建一个按标题和作者命名为title.txt 的新列表。

author.txt 在此布局中保持不变:“作者姓名”“空格”“连字符”“空格”“标题”。

摘录如下:

Aaron James - Assholes--A Theory
Adam Grant - Originals_ How Non-Conformists Move the World
Adam Lashinsky - Inside Apple
Adam Penenberg - Viral Loop (Facebook to Twitter)
Adam Rothstein - The End of Money
Agatha Christie - And Then There Were None
Al Murray - Let's Re-Great Britain
Alan Dean Foster - The Dig
Alan Furst - Night Soldiers
Alan Glynn - Limitless
Alan Greenspan - The Map and the Territory
Alan Moore - V for vendetta
Alastair Reynolds - Century Rain

【问题讨论】:

    标签: sorting batch-file find


    【解决方案1】:

    如果我理解正确,您想将排序列表 <author> - <title> 转换为重新排序列表 <title> - <author>。这是一个(当前未经测试!)纯批处理脚本方法,依赖于假设没有 <author> 部分包含分隔符序列 SPACE + - + SPACE自己的:

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    
    rem //Define constants here:
    set "_INFILE=author.txt"
    set "_OUTFILE=title.txt"
    set "_TMPFILE=%TEMP%\%~n0_%RANDOM%.tmp"
    set "_SEP= - "
    (set _NL=^
    %= empty line =%
    )
    
    > "%_TMPFILE%" (
        for /F usebackq^ delims^=^ eol^= %%L in ("%_INFILE%") do (
            set "AUTHOR=" & set "LINE=%%L"
            setlocal EnableDelayedExpansion
            for /F delims^=^ eol^= %%T in ("!LINE:*%_SEP%=!") do (
                for /F delims^=^ eol^= %%A in (^"!LINE:%_SEP%^=^%_NL%%_NL%!^") do (
                    endlocal
                    if not defined AUTHOR (
                        set "AUTHOR=%%A"
                        set "TITLE=%%T"
                    )
                    setlocal EnableDelayedExpansion
                )
            )
            if defined AUTHOR echo(!TITLE!%_SEP%!AUTHOR!
            endlocal
        )
    )
    sort "%_TMPFILE%" /O "%_OUTFILE%"
    del "%_TMPFILE%"
    
    endlocal
    exit /B
    

    【讨论】:

    • 纯 Windows 命令处理器解决方案的绝佳解决方案也适用于标题中包含 !"%author.txt。看到解决文本文件重新格式化任务是多么困难,这对我来说真的很有趣Perl 正则表达式 Replace all,使用 UltraEdit 的 Sort 命令对行进行排序,最后按 F12 将重新格式化的文件保存为 title.txt,我只用了 15 秒。
    • 感谢您的测试! ;-) 好的我知道了;不幸的是,cmd 缺少一个很好的正则表达式工具来完成这些简单的任务......
    【解决方案2】:

    下载由 Dave Benham 编写的JREPL.BAT,它是一个批处理文件/JScript 混合体,用于使用 JScript 对文件运行正则表达式替换,并将其存储在与下面的批处理文件相同的目录中,还包含author.txt.

    @echo off
    if not exist "%~dp0jrepl.bat" goto :EOF
    if not exist "author.txt" goto :EOF
    
    call "%~dp0jrepl.bat" "^(.+) - (.+)$" "$2 - $1" /F "author.txt" | %SystemRoot%\System32\sort.exe /O "title.txt"
    

    这里不需要命令 CALL,因为重定向运算符 | 会导致在完成 JREPL.BAT 执行后继续在此批处理文件上执行批处理文件>。但通常需要使用命令 CALL 从批处理文件中运行另一个批处理文件,并在完成调用批处理文件执行后继续在调用批处理文件上执行(不包含命令exit没有选项/B)。

    要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

    • call /?
    • echo /?
    • goto /?
    • sort /?
    • jrepl.bat /?

    【讨论】:

      【解决方案3】:

      对于 perl 实现:

      open (my FILE,"<","author.txt"); # Provide complete path
      @authorlist = <FILE>;
      s/^(.+?)\s*?-\s*?(.+)\s*+$/$2 - $1/ or warn "Unable to match regex in line: $_\n" foreach (@authorlist);
      print join("\n",@authorlist);
      

      刚刚测试了等效代码并且工作正常。

      提供摘录作为输入时获得的输出:

      混蛋——一种理论 - 亚伦·詹姆斯
      Originals_ 非墨守成规者如何推动世界 - 亚当·格兰特
      苹果内部 - Adam Lashinsky
      病毒循环(Facebook 到 Twitter)- Adam Penenberg
      金钱的终结 - 亚当·罗斯坦
      然后就没有了 - 阿加莎·克里斯蒂
      Let's Re-Great British - Al Murray
      挖掘 - 艾伦·迪恩·福斯特
      夜间士兵 - 艾伦·弗斯特
      无限 - 艾伦·格林
      地图和领土 - 艾伦·格林斯潘
      V 字仇杀队 - 艾伦·摩尔
      世纪雨 - 阿拉斯泰尔雷诺兹

      警告语句将有助于确定正则表达式在哪里失败(如果有的话)。

      【讨论】:

        猜你喜欢
        • 2014-02-26
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        • 2020-05-07
        • 2017-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多