【问题标题】:Split large CSV file with header into multiple CSV files for every nth row with a header将带有标题的大型 CSV 文件拆分为每个带有标题的第 n 行的多个 CSV 文件
【发布时间】:2012-09-28 14:41:38
【问题描述】:

我有一个大的 CSV 文件,我想将它拆分为多个 CSV 文件。我尝试了许多 VBS 脚本,但似乎无法得到这个。

这个脚本做了我想做的一些事情,但没有将它们保存为 CSV 文件:

Sub Split()
Dim rLastCell As Range
Dim rCells As Range
Dim strName As String
Dim lLoop As Long, lCopy As Long
Dim wbNew As Workbook

With ThisWorkbook.Sheets(1)
    Set rLastCell = .Cells.Find(What:="*", After:=[A1], SearchDirection:=xlPrevious)

    For lLoop = 1 To rLastCell.Row Step 35
        lCopy = lCopy + 1
        Set wbNew = Workbooks.Add
        .Range(.Cells(lLoop, 1), .Cells(lLoop + 35, .Columns.Count)).EntireRow.Copy _
        Destination:=wbNew.Sheets(1).Range("A1")
        wbNew.Close SaveChanges:=True, Filename:="Inventory_" & lLoop + 34
    Next lLoop
End With

结束子

【问题讨论】:

  • 在关闭工作簿之前,将其保存为 CSV:wbNew.SaveAs FileName:="C:\Temp\MyCSV.csv", FileFormat:=xlCSV。之后,您可以使用SaveChanges:=False 关闭工作簿。
  • 您可以通过记录集获得更多控制权:stackoverflow.com/questions/427488/…

标签: csv excel vbscript vba


【解决方案1】:

在你的代码中添加了一个 saveas 行来指定文件格式,你应该已经设置好了

Sub Split()
Dim rLastCell As range
Dim rCells As range
Dim strName As String
Dim lLoop As Long, lCopy As Long
Dim wbNew As Workbook

With ThisWorkbook.Sheets(1)
    Set rLastCell = .Cells.Find(What:="*", After:=[A1], SearchDirection:=xlPrevious)

    For lLoop = 2 To rLastCell.Row Step 35
        lCopy = lCopy + 1
        Set wbNew = Workbooks.Add
        .Cells(1, 1).EntireRow.Copy _
        Destination:=wbNew.Sheets(1).range("A1")
        .range(.Cells(lLoop, 1), .Cells(lLoop + 35, .Columns.Count)).EntireRow.Copy _
        Destination:=wbNew.Sheets(1).range("A2")
        wbNew.SaveAs FileName:="Inventory_" & format(lLoop + 34,"0000") & ".csv", FileFormat:=xlCSV, Local:=True
        wbNew.Close SaveChanges:=False
    Next lLoop
End With

End Sub

【讨论】:

  • 这很接近。有没有办法在每个后续的 CSV 文件中保留第一行?另外,有没有办法让文件名每次都有4个数字?目前,它创建 Inventory_35.csv、Inventory 135.csv、Inventory 1235.csv。我们可以改变它,让它总是有 4 个数字吗?因此,Inventory_0035.csv、Inventory 0135.csv、Inventory 1235.csv 等。人。
  • 另外,我希望能够使用分号分隔而不是逗号分隔。那么有没有办法设置sperator?
  • 在保存之前更改您计算机上的区域设置(然后将其更改回来)。区域和语言 \ 其他设置 \ 列表分隔符。
  • 是的,我已经这样做了(并且没有改回来),但是 VBA 将它们保存为逗号分隔而不是分号分隔??
  • 我为您的第一个问题更改了代码。对于逗号与半列,您的 Excel 工作表中的逗号是否以逗号开头?
【解决方案2】:

在我的头顶:

Const ForReading = 1
Const ForWriting = 2

Set fso = CreateObject("Scripting.FileSystemObject")

maxRows = 35
i = 0
n = 0

Set out = Nothing
Set csv = fso.OpenTextFile("C:\PATH\TO\your.csv", ForReading)
header = csv.ReadLine

Do Until csv.AtEndOfStream
  If i = 0 Then
    If Not out Is Nothing Then out.Close
    Set out = fso.OpenTextFile("out_" & Right("00" & n, 2) & ".csv", ForWriting)
    out.WriteLine(header)
    n = n + 1
  End If
  out.WriteLine(csv.ReadLine)
  i = (i + 1) Mod maxRows
Loop

csv.Close    
If Not out Is Nothing Then out.Close

【讨论】:

  • 我同意。无需涉及 Excel。
猜你喜欢
  • 2021-07-15
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多