Фильтровать CSV-файл перед импортом в Excel - PullRequest
2 голосов
/ 16 декабря 2011

Я хочу импортировать файл CSV, который выглядит следующим образом (запятая - это разделитель):

x,y

Здесь x представляет идентификатор пользователя, а y значение, которое я хочу извлечь.

Во-вторых, у меня есть файл Excel, который имеет аналогичные, но значительно меньшие идентификаторы пользователей в первом столбце.Я хочу импортировать y -значение только тех пользователей, которые включены в файл Excel.

Кто-нибудь знает, как это сделать?

Ответы [ 3 ]

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

Вы можете использовать ADO. Грубо говоря:

Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL As String
Dim TextInput As String

''This is not the best way to refer to the workbook
''you want, but it is very convenient for notes
''It is probably best to use the name of the workbook.

strFile = ActiveWorkbook.FullName

''Note that if HDR=No, F1,F2 etc are used for column names,
''if HDR=Yes, the names in the first row of the range
''can be used.
''
''This is the ACE connection string, you can get more
''here : http://www.connectionstrings.com/excel

strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
& ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"

TextInput = "[Text;FMT=Delimited;HDR=Yes;IMEX=2;DATABASE=Z:\docs]"

''Late binding, so no reference is needed
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open strCon

strSQL = "SELECT a.ID,a.Data " _
       & "FROM " & TextInput & ".[TestIn.csv] a " _
       & "INNER JOIN [Sheet1$] b ON a.ID=b.ID" _


rs.Open strSQL, cn, 3, 3


''Pick a suitable empty worksheet for the results

Worksheets("Sheet3").Cells(2, 1).CopyFromRecordset rs

''Tidy up
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
0 голосов
/ 16 декабря 2011

Я бы сделал что-то подобное, когда вы проверяете себя для каждого идентификатора пользователя. Измените его, чтобы оно работало на вас. Это должно идти довольно быстро.

Примечание. У меня есть ссылка на Microsoft Scripting Runtime, которая включает объекты Dictionary, FileSystemObject, File и TextStream.

Sub test()

    Dim i As Long
    Dim dicItems As Dictionary
    Dim fso As FileSystemObject
    Dim oFile As File
    Dim saItems() As String, saReturn() As String
    Dim oStream As TextStream
    Dim vUserID As Variant

    'Get stream of file
    Set fso = New FileSystemObject
    Set oFile = fso.OpenTextFile("YourFile.csv")
    Set oStream = oFile.OpenAsTextStream(ForReading)

    Set dicItems = New Dictionary
    'loop through items that you want extracted and put in dictionary
    vUserID = Range("A1", Range("A" & Rows.Count).End(xlUp)).Value2
    ReDim saReturn(1 To UBound(vUserID))
    For i = 1 To UBound(vUserID)
        dicItems.Add vUserID(i, 1), i
    Next i

    'Loop through stream lines
    Do While Not oStream.AtEndOfStream
        saItems = Split(oStream.ReadLine, ",")
        If dicItems.Exists(saItems(0)) Then
            saReturn(dicItems(saItems(0))) = saItems(1)
        End If
    Loop

    'Return information to your spreadsheet
    Range("B1", Range("B" & UBound(saReturn))) = Application.Transpose(saReturn)

End Sub
0 голосов
/ 16 декабря 2011

Если в ваших данных есть уникальные идентификаторы пользователей (как в файле Excel, так и в формате CSV), я просто перенесу CSV в Excel на отдельной вкладке, а затем просто наберу VLOOKUP() с нужным набором идентификаторов ( в файле Excel), чтобы получить эти конкретные значения y.

Примечание : я знаю, что на самом деле ничего не фильтруется до ввода CSV, но он довольно легко выполняет свою работу (извлекая значения y). Если вы хотите автоматизировать эту задачу, то, надеюсь, у кого-то есть более программный ответ:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...