VBA Excel: извлечение данных в определенном формате из файлов CSV - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть разные файлы 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, это первый раз, когда я буду работать над этим. Я начал работать над некоторыми примерами для создания и запуска кода VBA в Excel.

Кто-нибудь, пожалуйста, помогите мне продолжить, я хочу создать 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 в указанной папке и извлечения данных из определенных ячеек , и в нем есть информация о «циклическом просмотре файлов Excel в папке», но это не то, что Я ищу.

Я думаю, что мне нужно сделать здесь, удалить специальные символы, такие как , "" ;, из файла и затем отформатировать. Я просто не знаю, как поступить с этим.

Есть ли какой-нибудь инструмент для извлечения данных из файлов .CSV ??? Мне нужно предложение, идея или несколько хороших примеров для моей проблемы, и это будет очень полезно для меня.

Я делюсь одним из моих файлов здесь: http://uploadmb.com/freeuploadservice.php?uploadmbID=1323960039&srv=www&filename=4408_NANTES_softwares.csv

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Это работает для вашего файла примера:

' 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 в научной записи).

1 голос
/ 15 декабря 2011

у вас есть большой выбор, чтобы понять это.

Если ваша операция является исключением (только на сегодня), вы можете использовать функцию импорта и конвертирования файла CSV в Excel.

Откройте ваш Excel, на панели инструментов просто нажмите Data / Convert.

Если вы хотите поставить задачу наподобие макроса, вы можете взять пример с помощью этого скрипта:

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

End Sub

0 голосов
/ 19 августа 2016

Я знаю, что это старая ветка, но мне тоже пришлось это сделать, и я подумал, что мое решение может помочь будущим пользователям. Если существует элемент нулевой длины (например, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...