我需要弄清楚如何从.csv文件中删除最后一行。它基本上只是一排空格,但它搞乱了导入过程。我使用以下脚本做两件事(1)将.xls文件转换为.csv然后(2)从.csv文件中删除最后一行。第一部分工作正常但第二部分不能从文件中删除最后一行。在没有删除最后一行的地方,我做错了什么?
Const ForReading = 1
Const ForWriting = 2
Set ExcelObj = CreateObject("Excel.Application")
ExcelObj.DisplayAlerts = False
ExcelObj.Visible = false
ExcelObj.Workbooks.Open "C:\convert\ovations.xls"
ExcelObj.Workbooks(1).SaveAs "C:\convert\edited\TEST.csv", 6
ExcelObj.Workbooks.Close
ExcelObj.Quit
Set objFSo = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\convert\edited\TEST.csv", ForReading)
strContents = objFile.ReadAll
objFile.Close
arrLines = Split(strContents, vbCrLf)
Set objFile = objFSO.OpenTextFile("C:\convert\edited\TEST.csv", ForWriting)
For i = 0 to UBound(arrLines) - 1
objFile.WriteLine arrLines(i)
Next
objFile.Close
答案 0 :(得分:1)
当@trincot指出revised answer时,您可以调整行
For i = 0 To UBound(arrLines) - 1
到
For i = 0 To UBound(arrLines) - 2
并且代码可能会起作用,因为在没有考虑最后一次回车换行之前。
值得指出的是,通过调试问题可以轻松解决这个问题。
如果循环没有按预期运行,请检查您提供的数据。
使用WScript.Echo
或MsgBox()
输出数组arrLines
中的行数,然后与源文件进行比较,如果它们不匹配,则知道有额外的线。
通过一些简单的调试,您可以在几分钟内解决这个问题。
答案 1 :(得分:1)
您可能希望避免For循环(对于大文件)
Option Explicit
Const ForReading = 1
Const ForWriting = 2
Const txt = "C:\convert\ovations.xls"
Const csv = "C:\convert\edited\TEST.csv"
Dim xl, fso, fsoFile, fileTxt, lastCR, i
Set xl = CreateObject("Excel.Application")
xl.DisplayAlerts = False
xl.Visible = False
xl.Workbooks.Open txt
xl.Workbooks(1).SaveAs csv, 6
xl.Workbooks.Close
xl.Quit
Set fso = CreateObject("Scripting.FileSystemObject")
Set fsoFile = fso.OpenTextFile(csv, ForReading)
fileTxt = fsoFile.ReadAll
fsoFile.Close
Set fsoFile = fso.OpenTextFile(csv, ForWriting)
fsoFile.Write Left(fileTxt, InStrRev(fileTxt, vbCrLf, Len(fileTxt) - 1))
fsoFile.Close
最后一行也可以在Excel中删除(xl.Workbooks(1).SaveAs csv, 6
行之前)
With xl.Workbooks(1).Worksheets(1)
.Rows(.UsedRange.Rows.Count).Delete
End With
答案 2 :(得分:0)
当CSV文件的最末端存在CRLF序列时(这种情况),method2
将生成跟随该CRLF的部分,即空字符串。
你拥有的循环,省略了额外的空白字符串,但仍然保留了那个CRLF之前的内容,而Student
本身也产生了最终的CRLF,所以你最终会得到完全相同的结果。
如果你真的想省略最后一行,你必须从method2
结果中产生两个更少的行而不是一个更少:< / p>
Split()