从CSV

时间:2017-11-02 20:21:20

标签: csv vbscript scripting

我需要弄清楚如何从.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

3 个答案:

答案 0 :(得分:1)

@trincot指出revised answer时,您可以调整行

For i = 0 To UBound(arrLines) - 1

For i = 0 To UBound(arrLines) - 2

并且代码可能会起作用,因为在没有考虑最后一次回车换行之前。

值得指出的是,通过调试问题可以轻松解决这个问题。

  • 如果循环没有按预期运行,请检查您提供的数据。

    使用WScript.EchoMsgBox()输出数组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()