2012-11-27 9 views
7

Mam źródło danych, które jest rozdzielane przecinkami i kwalifikowane. Plik CSV. Jednak dostawca źródła danych czasami robi pewne dziwaczne rzeczy. Zrekompensowałem wszystkim oprócz jednego (czytamy w pliku wiersz po wierszu, a następnie zapisujemy go po oczyszczeniu) i szukam rozwiązania ostatniego problemu, gdy mój regex-fu jest dość słaby .Wyrażenie regularne w celu dopasowania cytowanego ciągu osadzonego w innym cytowanym ciągu

Dopasowanie cudzysłowie wewnątrz innego cudzysłowie

Więc tutaj jest nasz przykład ciąg ...

"foobar", 356, "Lieu-dit "chez Métral", Chilly, FR", "-1,000.09", 467, "barfoo", 1,345,456,235,231, "935.18" 

szukam dopasować podciąg „chez METRAL”, w w celu zastąpienia go podłańcuchem chez Métral. Idealnie, w jak najmniejszej liczbie linii kodu, jak to możliwe. Ostatecznym celem jest napisanie linii z powrotem (lub zwrócenie jej jako wartości zwracanej przez metodę) z już wykonaną wymianą.

Więc nasz przykład ciąg by skończyć jako ...

"foobar", 356, "Lieu-dit chez Métral, Chilly, FR", "-1,000.09", 467, "barfoo", 1,345,456,235,231, "935.18" 

wiem, mogę określić wzór takich jak (?<quotedstring>\"\w+[^,]+\") dopasować podane ciągi, ale mój regex-fu jest słaba (programista baz danych, prawie nigdy użyj C#), więc nie jestem pewien, jak dopasować inny cytowany ciąg w nazwie grupy quotedstring.


FYI: Dla tych, zauważając dużą liczbę całkowitą, która jest sformatowana przecinkami ale nie zacytować wykwalifikowana, która jest już obsługiwane. Podobnie jak losowe użycie ograniczników wierszy (czasami CR, czasem LF). Jako inne problemy ...

+1

Wygląda na to, że masz bardzo źle uformowaną próbę pliku CSV (nie jest ważne CSV). Regex prawdopodobnie nie będzie dobrym rozwiązaniem. – Oded

+1

A -> "A" | a jest gramatyką CF i nie można jej poprawnie dopasować za pomocą Wyrażeń regularnych. – fardjad

+0

W jaki sposób "już pracujesz" z osadzonymi przecinkami i "innymi problemami"? Czy ta sama metoda może być użyta do obsługi dodatkowych kwotowań? –

Odpowiedz

4

Wymień tym regex

(?<!,\s*|^)"([^",]*)" 

teraz zastąpić go $1

spróbować here


ucieczce " z "" byłoby stać

(?<!,\s*|^)""([^"",]*)"" 
+0

Wygląda na to, że przy powyższym wzorze ", 356," i ", 1,345,456,235,231," są również mecze oprócz "chez Métral". –

+0

@ TheLazyDBA nie pojawia się w ten sposób, ponieważ przetestowałem to .. działa – Anirudha

+0

Czy możliwe jest dalsze upiększenie odpowiedzi? –

Powiązane problemy