【问题标题】:Trim extra pipes off end of text file in Windows在 Windows 中修剪文本文件末尾的多余管道
【发布时间】:2014-04-04 13:01:56
【问题描述】:

所以基本上我有一个进程输出一个以管道分隔的文本文件,看起来像这样:

|abc123|1*|004|**gobbligook|001|%|2014-01-01|||||||||||||

这只是一个例子,我不确定答案是否涉及正则表达式。如果是这样,我将放置实际线。反正

问题

所以对于这个例子来说,接受这个文件的导入过程正在寻找 8 个管道,但是有 20 个,如果它在 8 个之后看到更多管道,它正在寻找导入过程失败。

问题

我是否可以在 Windows 环境中使用一个进程来修剪整个文件末尾的尾随管道?

更新

Magoo 为我提供了一个很好的答案,我正在工作,但我不断收到此错误:Delimiter is unexpected at this time

代码如下:

@ECHO OFF
SETLOCAL
SET "sourcedir=C:\Users\Desktop\Pipe Delimiter Project"
SET "destdir=C:\Users\Desktop\Pipe Delimiter Project"
(
 FOR /f "tokens=1-7delims=|" %%a IN ('TYPE "%sourcedir%\test.txt"') DO (
 ECHO(^|%%a^|%%b^|%%c^|%%d^|%%e^|%%f^|%%g^|
 )
)>%destdir%\newfile.txt

有人知道怎么回事吗?我也只是从问题 |abc123|..| 中插入了一行。在文件中粘贴了 6 次...谢谢!

【问题讨论】:

    标签: regex windows batch-file text trim


    【解决方案1】:
    @ECHO OFF
    SETLOCAL ENABLEDELAYEDEXPANSION
    SET "sourcedir=."
    SET "destdir=U:\destdir"
    (
     FOR /f "delims=" %%a IN ('TYPE "%sourcedir%\q22863616.txt"') DO (
     SET "line=%%a"
     ECHO(!line:~0,-12!
     )
    )>%destdir%\newfile.txt
    
    GOTO :EOF
    

    我使用了一个名为 q22863616.txt 的文件,其中包含您的数据用于我的测试。 生成 newfile.txt

    假设最后 12 个字段都是空的,否则缺少信息。


    另一种形式,给出附加信息

    @ECHO OFF
    SETLOCAL
    SET "sourcedir=."
    SET "destdir=U:\destdir"
    (
     FOR /f "tokens=1-7delims=|" %%a IN ('TYPE "%sourcedir%\q22863616.txt"') DO (
     ECHO(^|%%a^|%%b^|%%c^|%%d^|%%e^|%%f^|%%g^|
     )
    )>%destdir%\newfile.txt
    

    好的 - 第三次是一个魅力。

    @ECHO OFF
    SETLOCAL enabledelayedexpansion
    SET "sourcedir=."
    SET "destdir=U:\destdir"
    :: remove variables starting $
    FOR  /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="
    (
     FOR /f "delims=" %%a IN ('TYPE "%sourcedir%\q22863616.txt"') DO (
     SET "$0=%%a"
     SET "$1=%%a"
     FOR /l %%c IN (1,1,8) DO SET "$1=!$1:*|=!"
     SET "$2=%%a"
     SET "$3="
     SET /a tot=0
     FOR /f "delims=:" %%e IN ('set $^|findstr /o /r "$"') DO SET /a tot=%%e - !tot! - 5
     CALL :show !tot!
     CALL ECHO %%$2:~0,-!tot!%%
     )
    )>%destdir%\newfile.txt
    
    GOTO :EOF
    
    :show
    CALL SET "$3=%%$2:~0,-%1%%"
    FOR /f "tokens=1*delims==" %%y IN ('set $3') DO ECHO(%%z
    GOTO :eof
    

    这似乎对数据中的% 免疫,但会阻塞!&。你付钱,你做选择......

    【讨论】:

    • 你的测试文件在abc123前面有管道吗?我的没有。这会让它失败吗?
    • 其实我两种方式都试过了。仍然得到同样的错误。
    • 让我试试你的另一种形式选项
    • 我喜欢第二个选项,但此时我仍然觉得分隔符出乎意料...让我用我的代码更新我的问题@Magoo
    • 我怎样才能让它只丢弃尾随管道而不是那些可能是空列的字符之间的管道?
    【解决方案2】:

    这应该吃掉尾随的管道,但会留下 8 个

    @echo off
    type "file.txt"| repl "(.*?\|{8})\|*$" "$1" >"newfile.txt"
    

    这使用了一个名为 repl.bat 的帮助批处理文件 - 从以下位置下载:https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

    repl.bat 放在与批处理文件相同的文件夹或路径上的文件夹中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2011-08-22
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多