【问题标题】:VBA Excel : Extract data in specific format from CSV filesVBA Excel:从 CSV 文件中提取特定格式的数据
【发布时间】:2012-01-21 05:20:52
【问题描述】:

我有不同的 CSV 文件,这些文件有一些原始数据 Computer Name,"Computer Serial","User name","Employee Number","Software name" 后跟以下数据。

从链接文件中添加了这个:

Comp;uter;"Name ";Computer;Seria;l""    User";"name""   Employee";"Number"" Software";"name"""
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"LiveUpdate 3.3 (Symantec Corporation)";;;;;;;;                
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"Adobe SVG Viewer 3.0";;;;;;;;             
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"Adobe Download Manager 2.0 (Supprimer uniquement)";;;;;;;;                
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"ATI - Utilitaire de désinstallation du logiciel";;;;;;;;             
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"ATI Display Driver";;;;;;;;               
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"IBM iSeries Access for Windows";;;;;;;;               
DK4408XP0016,108081520001,"GAILLARD Alain",11014,DomusDraw;;;;;;;;              
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"NeXspan SoftPhone i2052 R3.1 D03";;;;;;;;             
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"Désinstallation du logiciel d''imprimante IBM";;;;;;;;               
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"Désinstallation du logiciel IBM";;;;;;;;             
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"CA 01 - le Offline MALL de Siemens Automation and Drives";;;;;;;;             
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"Java Web Start";;;;;;;;               
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"Correctif Windows XP - KB873339";;;;;;;;              
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"Correctif Windows XP - KB885250";;;;;;;;              
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"Correctif Windows XP - KB885835";;;;;;;;              
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"Correctif Windows XP - KB885836";;;;;;;;              
DK4408XP0016,108081520001,"GAILLARD Alain",11014,"Correctif Windows XP - KB886185";;;;;;;;

我以前从未使用过 Excel VBA,这是我第一次处理这个问题。我开始研究一些示例以在 Excel 中创建和运行 VBA 代码。

请有人帮我解决这个问题,我想创建 VBA 代码来提取原始数据并放入以下格式。

CompName    ComputerSerial  UserName    EmpNo   SoftwareName

DK4408XP0016 1108081520001  GAILLARD Alain  11014   LiveUpdate 3.3 (Symantec Corporation)
DK4408XP0016 1108081520001  GAILLARD Alain  11014   Adobe SVG Viewer 3.0

我检查了这个链接Code for looping through all excel files in a specified folder, and pulling data from specific cells,它有一个关于“excel loop through files in folder”的信息,但这不是我要找的。​​p>

我想,我需要在这里做的,从文件中删除像, "" ;这样的特殊字符,然后格式化。我根本不知道该怎么做。

是否有任何工具可以从 .CSV 文件中提取数据???我需要一些建议、想法或一些好的例子来解决我的问题,这对我很有帮助。

我在这里分享我的一个文件:http://uploadmb.com/freeuploadservice.php?uploadmbID=1323960039&srv=www&filename=4408_NANTES_softwares.csv

【问题讨论】:

  • 您的示例文件的格式与您在此处发布的格式不太一样:Comp;uter;"Name,""";Computer;Seria;"l"",""User";"name"",""Employee";"Number"",""Software";"name""" "DK4408XP0016,108081520001,""GAILLARD Alain"",11014,""LiveUpdate 3.3 (Symantec Corporation)""";;;;;;;; 那么它是哪一个??
  • @ Jean-François Corbett:你是对的。我有很多这样的文件。现在我已将示例添加到问题中。

标签: vba excel csv


【解决方案1】:

我知道这是一个旧线程,但我也必须这样做,我认为我的解决方案可能会帮助未来的用户。如果存在零长度元素(例如 elem1,elem2,,elem4),则数组值将 = ""。对我来说效果很好。

Function ParseLineEntry(LineEntry As String) As Variant
'This function takes a .CSV line entry as argument and parses it into an array of each element.

Dim NumFields As Integer, LastFieldStart As Integer
Dim LineFieldArray() As Long
Dim i As Long, j As Long

'Determine how many delimitations there are. There will always be at least one field
NumFields = 1
For I = 1 To Len(LineEntry)
    If Mid(LineEntry, i, 1) = "," Then NumFields = NumFields + 1
Next I
ReDim LineFieldArray(1 To NumFields)

'Parse out each element from the string and assign it into the appropriate array value
LastFieldStart = 1
For i = 1 To NumFields
    For j = LastFieldStart To Len(LineEntry)
        If Mid(LineEntry, j, 1) = "," Then
            LineFieldArray(i) = Mid(LineEntry, LastFieldStart, j - LastFieldStart)
            LastFieldStart = j + 1
            Exit For
        End If
    Next j
Next i

ParseLineEntry = LineFieldArray
End Function

【讨论】:

    【解决方案2】:

    这适用于您的示例文件:

    ' Open the csv file as a text file
    Workbooks.OpenText Filename:="C:\4408_NANTES softwares.csv"
    

    Excel 有时会自动解析 CSV 文件,但有时不会;我无法弄清楚模式。因此,您可以添加以下内容以确保正确解析:

    ' Parse it using comma and semicolon as delimiters
    Range(Range("A1"), Range("A1").End(xlDown)).TextToColumns _
        DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=True, Comma:=True, Space:=False, Other:=False, _
        FieldInfo:= _
        Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 1), Array(5, 2))
    

    FieldInfo 位可能看起来有点神秘,但它唯一的作用是指定您的字段将被视为文本(主要是为了避免您的序列号 108081520001 以科学记数法格式化)。

    【讨论】:

    • 我确信您的代码可以正常工作。我有一个问题,首先我解析文件以删除逗号和分号作为分隔符然后我使用你上面的代码,对吗?
    • 不!如果删除分隔符,那么 Excel 将如何知道每列的开始和结束位置?只需使用上面的代码打开并解析文件。我测试过了。
    • 它有效。如果我想要计算机名、用户名、软件名等任何三个字段,我应该怎么做?是否可以将 SoftwareName 更改为其他名称,例如“Application”?这个数组是什么"Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 1), Array(5, 2))"谢谢你的帮助。跨度>
    • 关于你关于数组的最后一个问题,请阅读我回答的最后一句,以及TextToColumns 的VBA 帮助文件,并查找FieldInfo 参数的描述。跨度>
    • 你“想要”这些字段是什么意思?这听起来像是一个不同的问题,因此您应该将其作为一个新问题发布。
    【解决方案3】:

    你有很多选择来实现这一点。

    如果您的操作是异常的(仅今天),您可以使用Excel的导入和转换CSV文件的功能。

    打开您的 Excel,在工具栏中,点击数据/转换。

    如果你想放一个宏之类的任务,你可以通过这个脚本来举例:

    Public Sub IsValid()
    Dim i As Long
    Dim valueTemp As String 'Chaine de caractere
    Dim wsTemp As Worksheet 'Feuille
    Dim rTemp As Range 'Range
    
    'Variable initialise a 1
    i = 1
    Set wsTemp = ThisWorkbook.Worksheets(NameFileResult)
    
    While (Ws_Result.Cells(i, 1) <> "")
        valueTemp = Ws_Result.Cells(i, 1)
    
        With ThisWorkbook 'ton fichier dans lequel tu fais ta recherche
            Set rTemp = wsTemp.Range("A:D").Find(valueTemp, , xlValues, xlWhole, , , False)
            If Not rTemp Is Nothing Then
                wsTemp.Rows(rTemp.Row).Interior.ColorIndex = 4 'Vert si la donnees est disponible
                wsTemp.Rows(rTemp.Row).Copy (Ws_Index.Rows(15))
                wsTemp.Rows(1).Copy (Ws_Index.Rows(14))
            Else
                Ws_Index.Rows(15).Clear
                Ws_Index.Rows(14).Clear
                Ws_Index.Cells(15, 5).Value = NameMsgBoxNoFind
                Ws_Index.Rows(15).Interior.ColorIndex = 3
            End If
        End With
        i = i + 1
    Wend
    

    结束子

    【讨论】:

    • 感谢您的支持。我可以毫无问题地在 Excel 中打开所有文件,但数据没有分类,所以我想运行一个宏。当我尝试使用 Data/Convert 时,什么也没有发生。我在这里分享了一个文件 [URL=uploadmb.com/…
    猜你喜欢
    • 2015-01-04
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多