VBA Excel:从CSV文件中提取特定格式的数据

VBA Excel:从CSV文件中提取特定格式的数据,vba,excel,csv,Vba,Excel,Csv,我有不同的CSV文件,这些文件有一些原始数据 计算机名、“计算机序列号”、“用户名”、“员工编号”、“软件名”后跟以下数据 从链接文件中添加了以下内容: Comp;uter;"Name ";Computer;Seria;l"" User";"name"" Employee";"Number"" Software";"name""" DK4408XP0016,108081520001,"GAILLARD Alain",11014,"LiveUpdate 3.3 (Symantec Cor

我有不同的CSV文件,这些文件有一些原始数据
计算机名、“计算机序列号”、“用户名”、“员工编号”、“软件名”
后跟以下数据

从链接文件中添加了以下内容:

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
我检查了这个链接&它有一个关于“excel循环文件夹中的文件”的信息,但这不是我要找的

我想,我需要在这里做的是,删除特殊字符,如
,“”然后选择格式。我简直不知道该怎么做

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


我在这里分享我的一个文件:

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

如果您的操作是一个例外(仅适用于今天),您可以使用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
Public子系统有效()
我想我会坚持多久
Dim valueTemp作为字符串“字符链”
将wsTemp标注为工作表“Feuille”
将rTemp变暗为“范围”
'变量初始化a 1
i=1
Set wsTemp=ThisWorkbook.Worksheets(NameFileResult)
而(Ws_Result.Cells(i,1)”)
valueTemp=Ws_结果单元格(i,1)
有了这本工作手册,你就可以重新开始了
设置rTemp=wsTemp.Range(“A:D”).Find(valueTemp,xlValues,xlWhole,,False)
如果不是rTemp,那么什么都不是
wsTemp.Rows(rTemp.Row).Interior.ColorIndex=4'垂直方向是可争议的
wsTemp.Rows(rTemp.Row).Copy(Ws_Index.Rows(15))
wsTemp.Rows(1).Copy(Ws_Index.Rows(14))
其他的
Ws_Index.Rows(15).清除
Ws_Index.Rows(14).清除
Ws_Index.Cells(15,5).Value=NameMsgBoxNoFind
Ws_Index.Rows(15).Interior.ColorIndex=3
如果结束
以
i=i+1
温德

End Sub

这适用于您的示例文件:

' 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
以科学记数法格式化)。

我知道这是一个旧线程,但我也必须这样做,我认为我的解决方案可能会帮助未来的用户。如果存在零长度元素(例如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

谢谢你的支持。我可以毫无问题地打开Excel中的所有文件,但是数据没有分类,所以我想运行宏。当我尝试使用数据/转换时,什么都没有发生。我在这里共享了一个文件[URL=您的示例文件的格式与您在这里发布的格式不太一样:
Comp;uter;“Name”,“Computer”;Seria;“l”,“User”,“Name”,“Employee”,“Number”,“Software”,“Name”“dk4408xp016108081520001”,“GAILLARD Alain”,“11014”,“LiveUpdate 3.3(赛门铁克公司)”你说得对。我有很多这样的文件。现在我已经在问题中添加了示例。我相信你的代码会起作用。我有一个问题,首先我解析文件以删除逗号和分号作为分隔符,然后我使用你上面的代码,对吗?不!如果你删除了分隔符,tExcel如何知道每一列的开始和结束位置?只需使用上面的代码打开并解析文件。我测试了它。它可以工作。如果我想有任何三个字段,如computerName、UserName、SoftwareName,我该怎么办?是否可以将SoftwareName更改为其他名称,如“应用程序”?这个数组是什么数组(数组(1,2),Array(2,2),Array(3,2),Array(4,1),Array(5,2))“感谢您的帮助。关于您最后一个关于数组的问题,请阅读我答案的最后一句,以及
TextToColumns
的VBA帮助文件,并查找
FieldInfo
参数的说明。您所说的“想要”是什么意思?”那些领域?这听起来像是一个不同的问题,因此你可能应该把它作为一个新问题发布。