2011-12-15 5 views
0

У меня разные CSV-файлы, и у этих файлов есть необработанные данные Computer Name,"Computer Serial","User name","Employee Number","Software name", за которыми следуют приведенные ниже данные.VBA Excel: Извлечение данных в определенном формате из 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, прежде чем, это первый раз, когда я собираюсь работать над этим. Я начал работать над некоторыми примерами, чтобы создать & код 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 

Я проверил эту ссылку Code for looping through all excel files in a specified folder, and pulling data from specific cells & он имеет информацию о «первенствовать проходные файлы в папке», но это не то, что я ищу.

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

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

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

+0

Формат вашего примера файл на самом деле не выглядеть как то, что вы вывесили здесь: 'Comp; Uter,«Имя»,«», Компьютер, Seria;«, „“ Пользователь „«л»;“ имя «« Сотрудник »,« Номер »,« Программное обеспечение »,« имя »,« »DK4408XP0016,108081520001,« GAILLARD Alain », 11014,« «LiveUpdate 3.3 (Symantec Corporation)» «" "; ;;;;;;; 'Так какой из них? –

+0

@ Жан-Франсуа Корбетт: ты прав. У меня много таких файлов. Теперь я добавил образец в вопрос. – linguini

ответ

1

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

' 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, который формируется в научной нотации).

+0

Я уверен, что ваш код будет работать. У меня вопрос: сначала я разбираю файл, чтобы удалить запятую и точку с запятой в качестве разделителей, тогда я использую ваш код выше, я прав? – linguini

+0

Нет! Если вы удалите разделители, то как Excel узнает, где начинается и заканчивается каждый столбец? Просто используйте приведенный выше код, чтобы открыть и проанализировать файл. Я протестировал его. –

+0

Это работает. Что мне делать, если я хочу иметь три поля типа computerName, UserName, SoftwareName? Можно ли изменить имя_компьютера как другое имя, например «Приложение»? что такое массив «Array (Array (1, 2), Array (2, 2), Array (3, 2), Array (4, 1), Array (5, 2))« Спасибо за вашу помощь. – linguini

1

у вас есть много Choise, чтобы реализовать это.

Если ваша операция является исключением (только на сегодняшний день), вы можете использовать функцию импорта и преобразования 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

Спасибо за поддержку. Я могу открыть все файлы в Excel без каких-либо проблем, но данные не классифицируются, поэтому я хочу запустить макрос. Когда я пытался с Data/Convert, ничего не происходит. Я поделился одним файлом здесь [URL = http: //uploadmb.com/freeuploadservice.php? UploadmbID = 1323959598 & srv = www & filename = 4408_NANTES_softwares.csv] 4408_NANTES_softwares.csv [/ URL] – linguini

0

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