2016-07-13 3 views
2

여러 개의 질문과 답변이 포함되어 있고 CSV처럼 구성되어있는 셀이 있습니다. 따라서 이러한 모든 질문과 답변을 구분 기호로 분리하여 분리하면 분리 기호가 쉽게 구분됩니다.스플릿, 특정 스플릿을 이스케이프 처리합니다.

불행히도 쉼표를 소수 구분 기호로 사용하는 일부 값이 있습니다. 그 사건에 대한 분할을 피할 수있는 방법이 있습니까?

다행히도 분리 기호로 ","를 사용하여 데이터를 분할 할 수 있지만이 경우가 아니라면 수동으로 10 진수 구분 기호를 쉼표에서 점으로 바꾸는 것 외에 해결책이 있습니까?

예 :

"가격 : 0.09, 수량 : 12 판매 : 예" 을 분할 사용 ("가격 : 0.09, 수량 : 12 판매 : Yes (예)", ",") 것 수율 :

가격 : 0
09
수량 : 12
이 판매 : 네

+1

이 정확한 문제는 "<>"또는 그런 종류의 것과 같이 "자연적으로"발생할 가능성이 매우 낮은 구분 기호를 사용하는 이유입니다. 의도하지 않은 구분 기호를 이스케이프한다는 측면에서, 나는 대체 문자를 사용하여 의도 된 구분 기호를 다른 것으로 변경해야하고 어떤 영리한 문자열 논리를 사용하여 어느 것이 바꿔야 하는지를 감지해야한다고 생각합니다. – RGA

+1

이것이 가장 바람직한 옵션입니다. 그러나 불행히도 구분자를 항상 결정할 수는 없으므로 제 3자가 귀하에게 제공하는 것을 처리해야합니다. – Luuklag

+0

not-delimiter-commas는 무언가에 의해 구분됩니다. ''톰, 밥, 해리는 각각 $ 1, 총 $ 얼마나됩니까? ','$ 9 '''? –

답변

0

하나의 가능성은,이 테스트 데이터 제공, 분할 후 배열을 통해 루프, 그리고에는 :가 없습니다 때마다 문자열, 이 항목을 이전 항목에 추가하십시오.

이 다음과 같을 수 수행하는 기능 : 예를 들어, 분리 caharacters : 및 매개 변수에 ,을함으로써 개선의 여지가 있다고

Public Function CleanUpSeparator(celldata As String) As String() 
    Dim ret() As String 
    Dim tmp() As String 
    Dim i As Integer, j As Integer 

    tmp = Split(celldata, ",") 
    For i = 0 To UBound(tmp) 
     If InStr(1, tmp(i), ":") < 1 Then 
      ' Put this value on the previous line, and restore the comma 
      tmp(i - 1) = tmp(i - 1) & "," & tmp(i) 
      tmp(i) = "" 
     End If 
    Next i 

    j = 0 
    ReDim ret(j) 
    For i = 0 To UBound(tmp) 
     If tmp(i) <> "" Then 
      ret(j) = tmp(i) 
      j = j + 1 
      ReDim Preserve ret(j) 
     End If 
    Next i 

    ReDim Preserve ret(j - 1) 

    CleanUpSeparator = ret 
End Function 

참고.

+0

실제로 이것은 깔끔한 해결책입니다. 나는 더 짧은 무엇이 있을지 궁금하다? – Luuklag

+0

어떻게 보이지 않습니까? 두 번째 반복을 건너 뛰고이를 호출하는 함수에서 빈 값을 처리 할 수 ​​있습니다 (즉, 데이터를 사용할 때). 나는 그런 종류의 것을 청소하는 것을 선호한다. 그 외에도 VB는 배열 항목을 제거하는 데 큰 도움이되지 않습니다. – steenbergh

+0

나는 당신의 코드가 구체적이고, 매우 효율적이고 깨끗하게 작성된 것은 아닙니다. 일반적으로 문제를 해결하기 위해보다 짧은 해결책이 존재합니다. – Luuklag

관련 문제