用于删除CSV文件中的行的等效sed命令

时间:2014-01-21 20:03:28

标签: csv vbscript sed

如果我的术语不正确,请提供帮助,请原谅。

find ./ -iname '*.csv' -exec sed -i '1,6d;$ d' '{}' ';'

这个在cygwin上运行的unix命令将遍历以.csv结尾的目录和子目录中的所有文件。 对于每个文件,它删除前6行和最后一行,这是返回的文件。

我的问题是如何在vbs脚本中编写等效文件?

我尝试编辑类似这样的内容(taken from here)以符合我的要求,但没有快乐。

Set fso = CreateObject("Scripting.FileSystemObject")
Set csv = fso.OpenTextFile(WScript.Arguments(...))

If Not csv.AtEndOfStream Then csv.SkipLine  'skip first row

Do Until csv.AtEndOfStream
  line = csv.ReadLine
  'process read line
Loop

csv.Close

注意:我希望使用任务计划程序

定期安排此vbs脚本

EDIT 在运行脚本之前,文件将如下所示:( row7和row ??之间的行数是可变且未知的)

<blank line/row1>
<blank line/row2>
<Text would be on this row/line3>
<Text would be on this row/line4>
<Text would be on this row/line5>
<blank line/row6>
<Text would be on this row/line7>
.
.
.
<Text would be on this row/line??>
<Text would be on this Last row/line>

2 个答案:

答案 0 :(得分:0)

dim fso, csv, Iter, ThisLine

Set fso = CreateObject("Scripting.FileSystemObject")
Set csv = fso.OpenTextFile(WScript.Arguments(...))

Iter=1
while not csv.AtEndOfStream 
   ' Buffer the line for last line test
   ThisLine = csv.ReadLine

   ' stdout if after the 6th line and not the last (the one EOF is true after reading the line)
   if (Iter > 6) and ( not csv.AtEndOfStream) then
      wscript.echo ThisLine
    end if
   Iter = Iter + 1
 wend

csv.Close

如果约束是X最后一行而不是最后一行,则应首先读取该文件,使用此对象(流文本文件)评估行号,然后计算行而不是返回行。 否则,如果不是太大,在内存中加载X行的缓冲区或使用另一种方法来读取文件(例如ADO,你有一个光标的概念,知道行的绝对位置和最后一行号)

答案 1 :(得分:0)

我会这样做:

Set fso = CreateObject("Scripting.FileSystemObject")

filename = "C:\path\to\your.csv"

Set inFile  = fso.OpenTextFile(filename)
Set outFile = fso.OpenTextFile(filename & ".tmp", 2, True)

Do Until inFile.AtEndOfStream
  If inFile.Line <= 6 Then
    inFile.SkipLine
  Else
    if Not IsEmpty(line) Then outFile.WriteLine line
    line = inFile.ReadLine
  End If
Loop

inFile.Close
outFile.Close

fso.DeleteFile filename, True
fso.MoveFile filename & ".tmp", filename

这里的技巧是在读取当前行之前打印上一次迭代中的行。这样就省略了最后一行。