2015-05-14 7 views
1

Этот код берет CSV файл, такие как:Excel VBA расколоть CSV файлов определенного порядка

"Penn National Gaming, Inc.",16.28 
"iShares 20 Year Treasury Bond E",118.88 
"iShares MSCI Emerging Index Fun",42.40 

Шаг 1

линия 0: "" Penn National Gaming, Inc. ", 16,28

линия 1: "иШэрес 20 год казначейских облигаций E", 118,88

Line 2: "иШэрес MSCI Emerging Index Fun", 42,40

Шаг 2

Он принимает линии 0 и делает его:

Значение 0: Penn National Gaming

Значение 1:, Inc.

Значение 2: 16,28

Мой вопрос: Как я могу сделать это как:

Значение 0: Penn National Gaming Inc.

Значение 1: 16,28

Содержите полное имя (оно может содержать более 1 запятой) в Значение 0 и сохранить значение 1 как есть, но в то же время по-прежнему удалять запятые, разделяя данные CSV. Я думал о каком-то порядке (удалить только 1 запятую от линии 1 начиная с конца до начала строки, но я не мог найти способ сделать это.

Спасибо!

Dim Resp As String: Resp = Http.ResponseText 
Dim Lines As Variant: Lines = Split(Resp, vbLf) 
Dim sLine As String 
Dim Values As Variant 

For i = 0 To UBound(Lines) 
    sLine = Lines(i) 
     If InStr(sLine, ",") > 0 Then 
     Values = Split(sLine, ",") 

ответ

1

Это была интересная проблема. Я придумал общую функцию, которая будет работать для любого количества не кавычек и кавычек в строке csv, где цитируемые значения могут содержать или не содержать запятые.

Test Line:"Penn National Gaming, Inc.",16.28
Выход:

Value[0] = Penn National Gaming, Inc. 
    Value[1] = 16.28 

Test Line:a,b,c,"some, commas, here",16.28,"some,commas,there",17.123
Выход:

Value[0] = a 
    Value[1] = b 
    Value[2] = c 
    Value[3] = some, commas, here 
    Value[4] = 16.28 
    Value[5] = some,commas,there 
    Value[6] = 17.123 
  1. Я сначала обыскал линию для пар котировок «...».

  2. В каждой паре цитат я искал запятую и заменял их символом, который, как я полагаю, никогда не будет присутствовать нормально, replacementCharacter = "¯" (вы можете выбрать другой символ, если вам нужно).

  3. После того как запятые были заменены, я разделил строку запятыми, используя функцию Split().

  4. Затем я повторил полученный массив и заменил все замещающие символы запятыми.

Я проверил мой код, используя конкретный пример, приведенный и более общий пример смешанных цитируемым значений запятой и значения:

Код:

Function parseLine(sLine) 
    Dim Value As Variant 
    Dim i As Integer 

    quote = """" 
    delimiter = "," 
    replacementCharacter = "¯" 

    'get first pair of quotes 
    currentQuoteIndex = InStr(1, sLine, quote) 'get first quote 
    If (currentQuoteIndex = 0) Then 
     nextQuoteIndex = 0 
    Else 
     nextQuoteIndex = InStr(currentQuoteIndex + 1, sLine, quote) 'get next quote 
    End If 

    'get pairs of quotes and replace commas with replacementCharacter 
    Do While nextQuoteIndex <> 0 And currentQuoteIndex <> 0 

     subString = Mid(sLine, currentQuoteIndex + 1, nextQuoteIndex - currentQuoteIndex - 1) 
     subString = Replace(subString, comma, replacementCharacter) 
     sLine = Left(sLine, currentQuoteIndex - 1) + subString + Right(Mid(sLine, nextQuoteIndex + 1), Len(sLine)) 

     'get next pair of quotes 
     currentQuoteIndex = InStr(nextQuoteIndex + 1, sLine, quote) 'get first quote 
     If (currentQuoteIndex = 0) Then 
      nextQuoteIndex = 0 
     Else 
      nextQuoteIndex = InStr(currentQuoteIndex + 1, sLine, quote) 'get next quote 
     End If 
    Loop 

    'split string by commas 
    Values = Split(sLine, delimiter) 

    'replace replacementCharacter with commas 
    For i = 0 To UBound(Values) 
     Values(i) = Replace(Values(i), replacementCharacter, delimiter) 
    Next 
    parseLine = Values 
End Function 

Эта функция работает любое количество запятой, содержащей цитируемые строки, с столбцами в любом порядке.

+0

Спасибо за подробный ответ. Я попытался интегрировать его, однако по какой-то причине это не сработало. Значения 0,1 и 2 остаются неизменными, а 1 и 2 не группируются. Знаете ли вы, что может быть причиной, и не могли бы вы дать мне несколько рекомендаций относительно фактической интеграции с моим полным кодом? Спасибо! – Newskooler

0

Простое решение определяет местонахождение последней запятой. Эта информация используется для определения местоположения Ф.И.О. и цена внутри линии. Конечным результатом является массив, содержащий 2 значения.

Примечание: Дополнительные запятые в полное имя игнорируются из-за отсутствия разделения на запятая "" процесс, используемый

Dim Resp As String: Resp = Http.ResponseText 
Dim Lines As Variant: Lines = Split(Resp, vbLf) 
Dim sLine As String 
Dim Values(1) As Variant 

For i = 0 To UBound(Lines) 
    sLine = Lines(i) 

    'Reduced complexity by avoiding the need to split on commas "," 
    Values(0) = left(sLine,instrrev(sLine,",")-1) 'Full Name 
    Values(1) = mid(sLine,instrrev(sLine,",")+1) 'Price value 
Next 

Использование функции

Dim Resp As String: Resp = Http.ResponseText 
Dim Lines As Variant: Lines = Split(Resp, vbLf) 
Dim sLine As String 
Dim Values(1) As Variant 

Function extractData(sLine as String) 
    Dim tmpArray(1) As Variant 

    'Reduced complexity by avoiding the need to split on commas "," 
    tmpArray(0) = left(sLine,instrrev(sLine,",")-1) 'Full Name 
    tmpArray(1) = mid(sLine,instrrev(sLine,",")+1) 'Price value 

    extractData = tmpArray 

End Function 

For i = 0 To UBound(Lines) 
    sLine = Lines(i) 
    Values = extractData(sLine) 
Next 

Выход:

Значение 0: Penn National Gaming, Inc.

Значение 1: 16.28

+0

Привет @Stelian, если этот или любой ответ решил ваш вопрос, пожалуйста, рассмотрите [его принятие] (http://meta.stackexchange.com/q/5234/179419), щелкнув галочку. Это указывает более широкому сообществу, что вы нашли решение и дали некоторую репутацию как самому, так и самому себе. Это не обязательно. – WorkSmarter

+0

это не дает общего решения. Обратите внимание, что OP говорит, что строки могут иметь следующий формат: «Penn National Gaming, Inc.», 16.28 «iShares 20 Year Treasury Bond E», 118.88 «iShares MSCI Emerging Index Fun», 42.40. Ваше решение должно иметь возможность проанализируйте линию и превратите ее в массив. – Brino

+0

Это точечное решение, основанное на коде и примере, предоставленном OP. Вы правы, мое решение обрабатывало каждую строку файла CSV. При более тщательном рассмотрении сообщения OPs, можно заметить пример «Penn National Gaming, Inc.», 16.28 «iShares 20 Year Treasury Bond E», 118.88 «iShares MSCI Emerging Index Fun», 42.40 распределены по нескольким строкам с помощью vbLf. Из-за форматирования это было видно только из режима редактирования.Я поместил бы код в соответствующий контейнер, т. е. блок кода, чтобы правильно проиллюстрировать намерения OP.Пожалуйста, дайте мне знать, есть ли у вас какие-либо другие проблемы. @Brino – WorkSmarter