如果我的术语不正确,请提供帮助,请原谅。
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>
答案 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
这里的技巧是在读取当前行之前打印上一次迭代中的行。这样就省略了最后一行。