来自txt

时间:2018-08-22 06:06:16

标签: excel excel-vba text split export-to-excel

我需要一个文本文件,其中包含Excel中300万行的端口数据,每100万行的移植需要一个新的列表。告诉我代码有什么问题吗?

    Sub ReadFile()
  Dim I, J
  I = 1
  J = 1
  File = "\\bla.bla.bla\Desktop\vsr.txt"
  Open File For Input As #1
  Do While Not EOF(1)
    Line Input #1, MyString
    Sheets("LIST" & J).Cells(I, 1) = MyString
    If I = 1000000 Then
      I = 1
      J = J + 1
    Else
      I = I + 1
    End If
  Loop
  Close #1
End Sub

2 个答案:

答案 0 :(得分:2)

也许这样会更好。我无法测试它,因为您没有包含相同的数据,而且我不知道port data是什么,但是它应该可以工作。

如果存在问题(或任何时候遇到代码问题),请尝试使用 F8 逐步遍历代码,以准确查明每一行的情况。 (有关Chip Pearson here的更多信息。)

Option Explicit

Sub ReadFile()
    Const fName = "\\bla.bla.bla\Desktop\vsr.txt"
    Dim rowNum As Long, shtNum As Long, myString As String

    Open fName For Input As #1
    shtNum = 1
    Do While Not EOF(1)
        rowNum = rowNum + 1
        Line Input #1, myString
        Sheets("LIST" & shtNum).Cells(rowNum, 1) = myString
        If rowNum = 1000000 Then
            shtNum = shtNum + 1
            rowNum = 0
        End If
    Loop
    Close #1
End Sub

一些注意事项:

  • 在[每个]模块顶部始终使用'Option Explicit来帮助查找未正确声明或处理的变量。 (即MyString未声明)
  • 就个人而言,我尽量避免对变量使用File之类的常用词,因为它可能是也可能不是“保留词”(即Excel内置的常量或函数名)
  • 我个人通常将变量的第一个字母写成小写,以便一目了然地将变量与内置关键字区分开。
  • 避免使用无意义的变量,例如IJ(尤其是在发布代码以寻求他人帮助时)。几个额外的字符使代码更易于理解,以后可以修改/调试。
  • 声明变量时,请尽可能指定一种数据类型。
  • 您没有提及创建工作表的任何内容,并且您的代码也没有尝试过,因此此代码假定所有必需的输出工作表存在并且为空白
  • 使用shtNum(或您的示例中的J)的替代方法是使用Int(rowNum/1000000)+1获取工作表编号。此公式返回1代表0到999999,2代表1000000到1999999,等等。

答案 1 :(得分:1)

@ashleedawg已经编写了大多数重要内容,将鼠标悬停在代码上再进行更正。

现在,处理数据的方式意味着您在vsr.txt文件中查找行,然后将其复制到字符串中,最后将其写入单元格中。这会占用很多处理能力,并且会很慢(尤其是您访问单元格的那部分。将所有文本复制到数组中然后一次粘贴所有文本会更加有效。

WorksheetFunction.Transpose()是必需的,因为excel中的数组使用Columns作为第一个维度。
每1万行插入代码可防止移调功能遇到问题。我假设由于它是WorksheetFunction代码的一部分,因此它可以在一些旧代码上进行中继,甚至可以通过特定方式以这种方式运行滞后代码(返回值的长度必须是长度为Integer的数组或其他内容)。
使用myWb可以使Range修饰符完全合格,虽然不是必须的,但是可以为您省去很多麻烦。
使用GROUPSIZE,您可以一次调整要导入的Array-Block的大小,更大的数字可能会加快处理速度。

Option Explicit

Sub ReadFile()

    Const GROUPSIZE As Long = 10000 'ENTRIESPERPAGE must be divisible by this without rest to fit exactly 
    Const ENTRIESPERPAGE As Long = 1000000 
    Const fName As String = "\\bla.bla.bla\Desktop\vsr.txt"

    Dim rowNum As Long
    Dim rowOffset As Long
    Dim shtNum As Long
    Dim myString(1 To GROUPSIZE) As String
    Dim myWB As Workbook
    Dim Range2Fill As String

    Set myWB = ThisWorkbook

    Open fName For Input As #1
    shtNum = 1
    rowNum = 0
    rowOffset = 0
    Do While Not EOF(1)
        rowNum = rowNum + 1
        Line Input #1, myString(rowNum)

        If rowNum = GROUPSIZE Then
            Range2Fill = "A" & rowOffset + 1 & ":A" & rowOffset + rowNum
            myWB.Worksheets(shtNum).Range(Range2Fill) = WorksheetFunction.Transpose(myString)
            Debug.Print "Sheet: " & shtNum, "Offset: " & rowOffset

            If rowOffset >= ENTRIESPERPAGE - rowNum Then
                rowOffset = 0
                shtNum = shtNum + 1
            Else
                rowOffset = rowOffset + GROUPSIZE
            End If

            rowNum = 0
        End If
    Loop

    'writes the last set of data in case there are not an exact multiple of 1M values
    Range2Fill = "A" & rowOffset + 1 & ":A" & rowOffset + rowNum
    myWB.Worksheets(shtNum).Range(Range2Fill) = WorksheetFunction.Transpose(myString)
    Close #1

End Sub

其他说明:

  • Excel每个工作表最多支持1,048,576行,但是希望在这么多数据点上性能会急剧下降,尤其是如果您开始计算它们或在图形中使用它们时。
  • 对于像这样的大型数据集,有更好的选择,到目前为止,我已经知道并使用了Origin,MatLab和DIAdem,免费的基于phyton的替代品将是Spyder。