2015-05-14 120 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: 「」 佩恩國民遊戲公司「, 16.28

1號線: 「iShares安碩20年期國債E」,118.88

線路2: 「iShares安碩MSCI新興指數趣」,42.40

步驟2

這需要線0,並使其在:

值0:佩恩國民博彩

Value 1:,Inc.

值2: 16.28

我的問題是:我怎樣才能讓它爲:

值0:佩恩國民博彩公司

值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行中的任何數量的非引號和引號值,其中引用的值可以包含或不包含逗號。

試驗線:"Penn National Gaming, Inc.",16.28
輸出:

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

試驗線: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. 然後我遍歷所得到的數組,並用逗號替換所有replacementCharacters。

我測試使用給出了具體的例子,混合引述逗號值的更一般的示例值我的代碼,並且:

代碼:

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:佩恩國民博彩公司

值1:16.28

+0

嗨@Stelian如果這個或任何答案已經解決了您的問題,請點擊複選標記,考慮[接受它](http://meta.stackexchange.com/q/5234/179419)。這向更廣泛的社區表明,您已經找到了解決方案,併爲答覆者和您自己提供了一些聲譽。沒有義務這樣做。 – WorkSmarter

+0

這不提供一個通用的解決方案。請注意,OP表示字符串的格式可能如下:「」賓夕法尼亞州國家博彩公司「,16.28」iShares 20年國債E「,118.88」iShares MSCI新興指數樂趣「,42.40。您的解決方案應該能夠解析行並將其轉換爲數組 – Brino

+0

這是一個基於OP提供的代碼和示例的解決方案,您是正確的,我的解決方案將處理CSV文件的每一行,仔細檢查OP後,人們會注意到,例如「賓夕法尼亞州國家博彩公司」,16.28「iShares 20年國債債券E」,118.88「iShares MSCI新興指數樂趣」,42.40分佈在多行與vbLf。由於格式化,這只是可見的在編輯模式下,我會把代碼放在適當的容器中,例如代碼塊,以便正確地說明OP的意圖,讓我知道你是否有其他問題。@Brino – WorkSmarter