3

我正在尝试使用 ms-dos 命令 findstr 查找字符串并将其从文件中删除。

目前我可以找到一个明确的字符串,但我真的很努力使用正则表达式。该文件如下所示:

PLs - TULIP Report  
Output_Format, PLS - TULIP REPORT  
NUMLINES,    110907
VARIABLE_TYPES,T1,T8,I,T9,T2,N,N,N  
[[data below]]

该文件是从某个系统导出的,并且令人讨厌的是其中包含该标题-因此我想在使用 SQL Loader 将其导入 Oracle 数据库之前对其进行清理。

不仅有一个文件,而且所有文件都具有相同类型的标题,但每个文件中的标题略有不同。虽然我很高兴首先使用硬编码值删除前两行,例如:

findstr /v "PLs - TULIP Report" "c:\myfiles\file1.PRO"  > "c:\myfiles\file1.csv"</code><br>
findstr /v "Output_Format, PLS - TULIP REPORT" "c:\myfiles\file1.csv" > "c:\myfiles\file2.csv"

(请注意我是如何分两步做到这一点的 - 任何可以一步完成的建议,将不胜感激)

第三行对我来说更复杂,它总是采用这种格式:

NUMLINES,    110907

除了每个文件末尾的数字不同。那么如何使用正则表达式找到整行呢?我努力了:

findstr /v /b /r "\D+ \s+ \d+"

但没有任何运气。

仅供参考,数据[[data below]]看起来像

*,"00000161",456823,"017896532","FU",23.95,3.34,20.61

等等..显然,我不想修改数据区。

希望上面说的有道理

谢谢

4

2 回答 2

1

您必须排除单行,findstr不能匹配多行。只需用空格分隔不同的正则表达式

findstr /r /b /v "NUMLINES PLs Output_Format" *.txt 
                  ^regex1  ^2  ^3

指定/b允许您仅在行的开头查找匹配项并/v排除这些行。

编辑:

当然用法是

 findstr /r /b /v "NUMLINES PLs Output_Format" yourfile > yourtarget

yourtarget你会发现yourfile除了正则表达式排除的行之外的数据。

编辑2:

根据您的评论,您只需添加VARIABLE_TYPES到您的正则表达式中即可

findstr /r /b /v "NUMLINES PLs Output_Format VARIABLE_TYPES" yourfile > yourtarget

这是在一条指令中完成整个操作的方式。

于 2012-10-23T11:19:38.463 回答
0

这是一个使用正则表达式的单行,它将排除所有四行。(我使用了续行以使代码看起来更好。)每一行都必须完全匹配。我允许每行以任意数量的空格结尾,因为我不确定您的格式。注意 - FINDSTR 正则表达式支持非常有限且非标准。还有许多其他 FINDSTR 怪癖和错误。请参阅Windows FINDSTR 命令有哪些未记录的功能和限制?了解更多信息。

findstr /vrx /c:"PLs - TULIP Report *"^
             /c:"Output_Format, PLS - TULIP REPORT *"^
             /c:"NUMLINES, *[0-9]* *"^
             /c:"VARIABLE_TYPES,T1,T8,I,T9,T2,N,N,N *"^
        "c:\myfiles\file1.PRO"  >"c:\myfiles\file1.csv"

如果您只需要跳过前 4 行,那么您通常应该能够使用 MORE。但是在某些情况下,大文件可能会挂起 MORE,但我不记得具体情况了。此外,MORE 会将制表符转换为一系列空格。

more +4 "c:\myfiles\file1.PRO"  >"c:\myfiles\file1.csv"

另一种选择是使用 FOR /F 循环。FOR /F 跳过空行,但我认为这不是你关心的问题。

>"c:\myfiles\file1.csv" (
  for "usebackq skip=4 delims=" %%A in ("c:\myfiles\file1.PRO") do echo(%%A
)

如果您的任何数据都可以以 a 开头,;那么代码会变得有点难看。然后,您可能希望通过将 EOL 选项设置为换行符来禁用它。

set LF=^


::above 2 blank lines are critical - do not remove
>"c:\myfiles\file1.csv" (
  for usebackq^ skip^=4^ eol^=^%LF%%LF%^ delims^= %%A in ("c:\myfiles\file1.PRO") do echo(%%A
)
于 2012-10-23T14:38:56.420 回答