VB net - plik csv - wyrażenie regularne

Odpowiedz Nowy wątek
Marek320
2014-12-09 21:33
Marek320
0

Witam.

Robię prosty programik w VB net obrabiający dane z urządzenia pomiarowego z którego otrzymuję lekko pomieszany plik csv.
Jest w nim użyty przecinek jako separator pól i jako przecinek dziesiętny.

A wygląda to tak:
"Tekst1","1,2",0,"Tekst2","120",4,">30" itd.

Problem w tym, że nie mogę wpaść na to jak zamienić , na . ale tylko w liczbie znajdującej się między przecinkami i w cudzysłowie czyli np.: ,"1,2", ma dać ,"1.2",
Po tym już bez problemu wykona się prawidłowy split po ,

Wiem, że chodzi o wyrażenia regularne, jednak jestem z tego noga.
Będę wdzięczny za wyrozumiałość i podpowiedź jak powinien wyglądać pattern i replacement dla regex.

Pozdrawiam

Pozostało 580 znaków

2014-12-09 21:53

Rejestracja: 6 lat temu

Ostatnio: 3 godziny temu

Lokalizacja: Warszawa

1

To chyba będzie tak. Ale to c#, konwertnij się.

    class Program
    {
        static void Main(string[] args)
        {
            string input = "\"Tekst1\",\"1,2\",0,\"Tekst2\",\"120\",4,\">30\"";
            string result;

            Regex rx = new Regex("\"\\d+,\\d+\"");
            result = rx.Replace(input, new MatchEvaluator(Program.Find));
            Console.WriteLine(result);

            Console.ReadKey();
        }

        static string Find(Match m)
        {
            return Regex.Replace(m.Value, ",", ".");
        }
    }

Edit: poprawka

edytowany 2x, ostatnio: dam1an, 2014-12-09 21:55

Pozostało 580 znaków

Marek320
2014-12-10 18:56
Marek320
0

Dzięki Dam1an, działa super, jednak dalej nie mogę zaskoczyć jak tworzy się klucz wyszukiwania.
Rozumiem, że d+ oznacza dowolne cyfry i ten przecinek między nimi to wymagana reguła dla znalezienia cyfr z przecinkiem między cudzysłowiami.
Jednak te ukośniki to już zagadka.

Niemniej dziękuję za pomoc i pozdrawiam.

Pozostało 580 znaków

2014-12-10 19:06

Rejestracja: 6 lat temu

Ostatnio: 3 godziny temu

Lokalizacja: Warszawa

0

\d - to jest dowolna liczba
+ oznacza powtórzenie raz lub więcej razy
Ponieważ \ dla c# jest to znak specjalny np stosowany w \n trzeba go powtórzyć drugim \
Ponieważ " też c# tak łatwo nie przyjmie trzeba go poprzedzić znakiem \

Pozostało 580 znaków

2014-12-10 19:22

Rejestracja: 5 lat temu

Ostatnio: 5 lat temu

0

Dzięki za łopatologiczne wyjaśnienia. Teraz rozumiem przynajmniej ten przypadek.

A dla ścisłości w VB ma on postać:
Regex("""\d+,\d+""")
cudzysłowie razy dwa, bo właśnie tak kompilator uznaje, że chce użyć ten znak w regule.
Ale zasada taka jak pisałeś.

Pozdrawiam.

edytowany 1x, ostatnio: Marek320, 2014-12-10 19:29
Tak, cudzysłów razy dwa albo można też poprzedzić go backslashem. - dam1an 2014-12-10 20:29

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0