【问题标题】:how to load a sectioned CSV file to an excel sheet?如何将分段的 CSV 文件加载到 Excel 工作表?
【发布时间】:2010-08-26 09:46:19
【问题描述】:

CSV 文件:

#3GMACRO,,,,,,,,,,,,,,
,,,,,,,,,,,,,,
IMSI,IMEI,Date,Time,UMTS MACRO-UARFCNDL,UMTS MACRO-PrimaryScramblingCode,UMTS MACRO-CPICHTxPower,UMTS MACRO-PLMNCellId,UMTS MACRO- RNCId,UMTS MACRO-MCC,UMTS MACRO-MNC,UMTS MACRO - LAC,UMTS MACRO - RAC,UMTS MACRO - MaxUETxPower,UMTS MACRO - MeasuredRSCP
2.6275E+14,3.57539E+14,20100107,160000,10662,11,-99,268435456,0,0,0,1,0,0,-74

,,,,,,,,,,,,,,
#3GFEMTO,,,,,,,,,,,,,,
,,,,,,,,,,,,,,
IMSI,IMEI,Date,Time,UMTS FEMTOS-UARFCNDL,UMTS FEMTOS-PrimaryScramblingCode,UMTS FEMTOS-CPICHTxPower,UMTS FEMTOS-PLMNCellId,UMTS FEMTOS-RNCId,UMTS FEMTOS-MCC,UMTS FEMTOS-MNC,UMTS FEMTOS-LAC,UMTS FEMTOS-RAC,UMTS FEMTOS-MaxUETxPower,UMTS FEMTOS- MeasuredRSCP
2.6275E+14,3.57539E+14,20100107,160000,10687,252,-24,61,0,610,3956,486,11,5,-102

,,,,,,,,,,,,,,
#2GMACRO,,,,,,,,,,,,,,
,,,,,,,,,,,,,,
IMSI,IMEI,Date,Time,GSM MACRO_CellID,GSM MACRO-MCC,GSM MACRO-MNC,GSM MACRO-LAC,GSM MACRO-RAC,GSM MACRO-Max permitted UE Tx power (SIB3),GSM MACRO-Measure RSSI,,,,
2.6275E+14,3.57539E+14,20100107,160000,GSM_Cell_Id=1,2,3,4,5,6,7,,,,

当我只单击一次加载时,我希望这个 csv 文件作为单独的部分加载到 Excel 工作表中(即每个部分应该转到 Excel 中的单独工作表)

CSV 文件包含部分名称、标题和数据

以下是 CSV 文件中的部分名称

3GMACRO

3GFEMTO

2GMACRO

以下是 CSV 文件中的标题名称 IMSI,IMEI,Date,Time,GSM MACRO_CellID,GSM MACRO-MCC,GSM MACRO-MNC............等

加载 CSV 文件后,3 个工作表应该有标题和数据。

请帮我这样做。

提前致谢

嗨 这是我尝试过的代码,但它不能根据需要完美运行。

Sub loadData()

'Runtime error handling
'On Error Resume Next

'Unprotect the password protected sheet for loading csv data
ActiveSheet.Unprotect Password:=pass
 
'Variable declaration
 Dim strFilePath As String, strFilename As String, strFullPath As String
    Dim lngCounter As Long
    Dim oConn As Object, oRS As Object, oFSObj As Object

    'Get a text file name
    strFullPath = Application.GetOpenFilename("Text Files (*.csv),*.csv", , "Please select text file...")
 'MsgBox "stringfullpath" & strFullPath
 
 
    If strFullPath = "False" Then Exit Sub  'User pressed Cancel on the open file dialog
    

    'This gives us a full path name e.g. C:tempfolderfile.txt
    'We need to split this into path and file name
    Set oFSObj = CreateObject("SCRIPTING.FILESYSTEMOBJECT")

    strFilePath = oFSObj.GetFile(strFullPath).ParentFolder.Path
    strFilename = oFSObj.GetFile(strFullPath).Name


    'Open an ADO connection to the folder specified
    Set oConn = CreateObject("ADODB.CONNECTION")
    oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=" & strFilePath & ";" & _
               "Extended Properties=""text;HDR=Yes;FMT=Delimited"""

    Set oRS = CreateObject("ADODB.RECORDSET")

    'Now actually open the text file and import into Excel
    'oRS.Open "SELECT * FROM " & strFilename & " , oConn"
    
    oRS.Open "SELECT * FROM " & strFilename, oConn
    While Not oRS.EOF
        Sheets("Neighbour3GMacro").Range("A3").CopyFromRecordset oRS
        'Sheets.Add Type:=Application.GetOpenFilename & "     *.csv"
        Sheets("Neighbour3GFemto").Range("A2").CopyFromRecordset oRS
        Sheets("Neighbour2GMacro").Range("A2").CopyFromRecordset oRS
        
    Wend

    oRS.Close
    oConn.Close
End Sub

【问题讨论】:

  • 能否请您提供您已经拥有的代码并指出您遇到问题的地方?人们不介意提供帮助,但他们很少愿意为您完成所有工作。
  • 首先调用任何文本处理程序(perl、awk 等)将输入分割为三个文件,然后通过简单的“打开”以编程方式逐个加载它们似乎更容易。

标签: vba csv excel excel-2010


【解决方案1】:

您可以使用Split 函数获取一个数组,并使用该数组填充一行。这是一个简单的解决方案。

您需要将Sheet1Sheet2Sheet3 更改为您的工作表名称,并且可能希望添加忽略标题行的功能。如果您有修复 ColumnCount,您还可以将 Ubound 函数替换为整数变量。

Sub loadData2()
Dim strFullPath As String
Dim oFSOBj As Object 'Scripting.FileSystemObject'
Dim oFileStream As Object 'Scripting.TextStream'

Dim targetSheet As Worksheet
Dim iRow As Long
Dim startRow As Long
Dim startColumn As Integer

Dim line As String

    'Please insert Error Handling etc.'

    'Get a text file name '
    strFullPath = Application.GetOpenFilename("Text Files (*.csv),*.csv", , "Please select text file...")
    If strFullPath = "False" Then Exit Sub  'User pressed Cancel on the open file dialog'

    Set oFSOBj = CreateObject("SCRIPTING.FILESYSTEMOBJECT")
    Set oFileStream = oFSOBj.GetFile(strFullPath).OpenAsTextStream(ForReading)

    Set targetSheet = Sheet1
    iRow = 0
    startRow = 3
    startColumn = 1

    While (Not oFileStream.AtEndOfStream)
        line = oFileStream.ReadLine
        If (Left(line, 1) = "#") Then
            iRow = 0
            If (Left(line, 8) = "#3GMACRO") Then Set targetSheet = Sheet1
            If (Left(line, 8) = "#3GFEMTO") Then Set targetSheet = Sheet2
            If (Left(line, 8) = "#2GMACRO") Then Set targetSheet = Sheet3
        ElseIf Trim(line) <> vbNullString Then  'Else Block: line has content'
            csline = Split(line, ",")
            targetSheet.Range(targetSheet.Cells(startRow + iRow, startColumn), targetSheet.Cells(startRow + iRow, startColumn + UBound(csline))).Value2 = csline
            iRow = iRow + 1
        End If
    Wend
    oFileStream.Close
    Set oFileStream = Nothing
    Set oFSOBj = Nothing
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多