Хочу, чтобы VBA в Excel считал очень большой CSV и создал выходной файл маленького подмножества CSV

Вы можете установить свойство Action для объекта PagingList:

var model = await PagingList.CreateAsync(userlist, 2, page);
model.Action = "Organizations";
11
задан e.James 14 January 2009 в 20:51
поделиться

7 ответов

Следующий код должен добиться цели. У меня нет Excel передо мной, таким образом, я не протестировал его, но понятие является звуковым.

Если это заканчивает тем, что было слишком медленно, мы можем посмотреть на способы повысить эффективность.

Sub SelectSomeRecords()
    Dim testLine As String

    Open inputFileName For Input As #1
    Open outputFileName For Output As #2

    While Not EOF(1)
        Line Input #1, testLine
        If RecordIsInteresting(testLine) Then
            Print #2, testLine
        End If
    Wend

    Close #1
    Close #2
End Sub

Function RecordIsInteresting(recordLine As String) As Boolean
    Dim lineItems(1 to 8) As String

    GetRecordItems(lineItems(), recordLine)

    ''// do your custom checking here:
    RecordIsInteresting = lineItems(8) = "LS1 7AA"
End Function

Sub GetRecordItems(items() As String, recordLine as String)
    Dim finishString as Boolean
    Dim itemString as String
    Dim itemIndex as Integer
    Dim charIndex as Long
    Dim inQuote as Boolean
    Dim testChar as String

    inQuote = False
    charIndex = 1
    itemIndex = 1
    itemString = ""
    finishString = False

    While charIndex <= Len(recordLine)
        testChar = Mid$(recordLine, charIndex, 1)

        finishString = False

        If inQuote Then
            If testChar = Chr$(34) Then
                inQuote = False
                finishString = True
                charIndex = charIndex + 1 ''// ignore the next comma
            Else
                itemString = itemString + testChar
            End If
        Else
            If testChar = Chr$(34) Then
                inQuote = True
            ElseIf testChar = "," Then
                finishString = True
            Else
                itemString = itemString + testChar
            End If
        End If

        If finishString Then
            items(itemIndex) = itemString
            itemString = ""
            itemIndex = itemIndex + 1
        End If

        charIndex = charIndex + 1
    Wend
End Sub
8
ответ дан 3 December 2019 в 03:37
поделиться

Это непосредственно не отвечает на Ваш вопрос, но grep (или один из эквивалентов Windows), действительно сиял бы для этого, например,

grep -e <regex_filter> foo.csv > bar.csv
4
ответ дан 3 December 2019 в 03:37
поделиться

Как насчет VBScript, хотя это также работало бы в Excel:

Set cn = CreateObject("ADODB.Connection")

'Note HDR=Yes, that is, first row contains field names '
'and FMT delimted, ie CSV '

strCon="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Docs\;" _
& "Extended Properties=""text;HDR=Yes;FMT=Delimited"";"

cn.open strcon

'You would not need delimiters ('') if last field is numeric: '    
strSQL="SELECT FieldName1, FieldName2 INTO New.csv FROM Old.csv " _
& " WHERE LastFieldName='SomeTextValue'"

'Creates new csv file
cn.Execute strSQL
7
ответ дан 3 December 2019 в 03:37
поделиться

Посмотрите на Input # оператор в справке Excel

Демонстрационное использование было бы:

Input #fnInput, s_Forename, s_Surname, dt_DOB, i_Something, s_Street, s_Town, s_County, s_Postcode

и затем используйте Write # оператор для выписывания соответствия записям снова

Единственная проблема могла бы быть то, что формат даты в выводе закончится как # 1967-07-01#, но этот формат однозначен в отличие от 07.01.1967, который представил бы 1-го июля в Великобритании и 7-го января в США. Если необходимо сохранить форматирование даты, затем выписывают его как строку:

s_DOB = Format(dt_DOB, "dd/mm/yyyy")
2
ответ дан 3 December 2019 в 03:37
поделиться

Я использовал следующую производную кода, данного выше для успешного открытия произвольного файла CSV от VBA в Excel.

Явная опция
Общественность cn Как Соединение
Общедоступный Sub DoIt ()
Тусклый strcon Как Строка
Тусклый strsql Как Строка
Тусклый RS Как Recordset

Набор cn = CreateObject ("ADODB.Connection")

strcon = "Provider=Microsoft. Струя. OLEDB.4.0; Данные Source=C:\bin\HomePlanet\"; _
И "Расширенные свойства = "" текст; HDR=Yes; FMT=Delimited""";

cn. Открытый strcon

strsql = "ВЫБИРАЮТ * ИЗ astuname.csv"
RS набора = Новый ADODB.Recordset
RS. Откройте strsql, cn
DoEvents 'пауза здесь для осмотра RS объектов и свойств. Близко
Конец Sub

RS (recordset) имеет набор полей со свойством Count. Каждое поле как свойство Type.

Можно сослаться на поля порядковым номером...

Отладка. RS печати. Поля (RS. Поля. Количество - 1).Type

Действительно ли это достаточно?

В противном случае отправьте первые несколько строк входного файла, и я возьму его остальная часть пути.

3
ответ дан 3 December 2019 в 03:37
поделиться

Что-либо можно сделать a-row-at-a-time с vba в Excel, можно сделать в доступе с vba; плюс намного больше, потому что это - база данных, а не электронная таблица. Действительно ли доступ недоступен Вам?

Намного легче иметь дело с логическими таблицами, записями, и полями, чем логические рабочие листы, строками и столбцами.

Для входа, почему делает "/Data/Import Внешний Data/Text/csv" не, работают? Является вход не действительно портативным csv?

2
ответ дан 3 December 2019 в 03:37
поделиться

Я предложил бы смотреть на Библиотеку регулярных выражений (необходимо видеть его в "Инструментах... Ссылки" как "Microsoft VBScript Regular Expressions 5.5" или что-то очень похожее.

Существуют выборки и Reg Exp и довольно всестороннего познакового в этом местоположении: http://www.xbeat.net/vbspeed/c_ParseCSV.php. Обратите внимание, что версия Regexp является waaaay короче!

Весело провести время...

1
ответ дан 3 December 2019 в 03:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: