Piotr Nowak

Piotr Nowak Kierownik Projektu
(Project Manager),
Orange Polska

Temat: import pliku csv/txt i replace

Witam,
Plik źródłowy jest w formacie CSV z separatorem średnik i cudzysłowem jako ogranicznik pola. Problem mam w trakcie importu do Access'a 2010 z polem, w którym pomimo ogranicznika tekstu jest jeszcze backslash np.
"243";"Firma handlowa \"Mimi\" Artur Adamski";"LUBLIN"
Po imporcie w kolumnach mam tylko:

243
Firma handlowa \

zamiast:
243
Firma handlowa "Mimi" Artur Adamski
LUBLIN

W związku z tym szukam rozwiązania, które w trakcie importu usuwało by z pliku źródłowego tego backslash'a i tu myślałem o funkcji Replace, ale nie wiem jak ją wykorzystać w trakcie importu.
Zakładał bym może wykorzystanie array (w locie), albo stworzenia pliku tymczasowego, z którego był by faktycznie wykonany ten import. Plik źrdłowy NIE MOŻE ulec modyfikacji. Owszem można by otworzyć plik w notatniku i wykonać zamianę \" na sam ", ale nie o to mi chodzi.
To usuwanie tego backslash'a mogło by dotyczyć całego rekordu, albo wskazanych pól w rekordzie, gdyż są przypadki, że oprócz fragmentu nazwy firmy zapisanej w cudzysłowach, jeszcze trafiają się ulice np. "ul. Tadeusza Zawadzkiego "Zośki"".

Proszę o pomoc w rozwiązaniu powyższego.
Pozdrawiam
Marzanna Szulta

Marzanna Szulta właściciel, Usługi
Informatyczne
SZULTASET

Temat: import pliku csv/txt i replace

Przetestowałam ten przykład i faktycznie - podczas importu pojawia się błąd (rekord niemożliwy do rozdzielenia). Wyłączyłam ogranicznik tekstu i importuje całość, prawidłowo umieszczając wartości w poszczególnych polach. Wprawdzie trzeba to oczyścić, ale mając w kolumnach tabeli - to już żaden problem. Efekt końcowy wygląda tak.

Obrazek
post został edytowany przez Autora dnia 23.08.16 o godzinie 06:43
Piotr Nowak

Piotr Nowak Kierownik Projektu
(Project Manager),
Orange Polska

Temat: import pliku csv/txt i replace

Owszem , wyłączenie kwalifikatora tekstu zaimportuje poprawnie, ale problem polega na tym, że jak tych kolumn jest 30-40 i każdą trzeba by oczyścić z początkowego i końcowego cudzysłowu, to ..... jest z tym trochę zabawy. Dodatkowo proponowane rozwiązanie nie zadziała, gdyż zawartość pliku jest:
"ID";"NazwaFirmy";"MiastoFirmy";"UlicaFirmy";"TelefonFirma"
"243";"Firma handlowa \"Mimi\" Artur Adamski";"LUBLIN";"ul. Długa 5";"13244657"
"12";"LAN Connect Sp. z o.o.";"Katowice";"al. Tadeusza Zawadzkiego \"Zośki\" 23";"21638453;21638567"
Czy plik ma nagłówek.
Przy takim imporcie trzeba by pomijać nie tylko kwalifikator tekstu, ale również i nagłowek (ponieważ nazwy kolumn nie zawierają cudzysłowu), a po imporcie (do tablicy tymczasowej), kasować rekord z nagłówkiem, oraz "poprawić" wszystkie kolumny, aby nie zaczynały się i nie kończyły cudzysłowem. Pomijając kwalifikator tekstu, pojawi się również inny problem. Chodzi o zapis w polu "TelefonFirma", gdzie podane sa dwa numery telefonów rozdzielone średnikiem.
Z różnych testów wydaje się, że najbardziej bezpiecznym separatorem kolumn będzie znak tabulacji, gdyż nie jest możliwe, aby w systemie źródłowym, w danym polu wprowadzić znak tabulacji.
Dlatego szukam rozwiązania, które pozwoliły by "w locie" na obróbkę pliku w ten sposób, aby nastąpiło usunięcie znaków cudzysłowa z pierwszego wiersza, gdzie są nagłówki kolumn, oraz dla całego pliku następowała by zamiana separatora kolumn z ŚREDNIK'a na TABulator. Po imporcie konieczne było by jeszcze oczyszcznie cudzysłowów na począku i na końcu każdego pola.
A może inne pomysły/rozwiązania? - coś w VBA?

PozdrawiamTen post został edytowany przez Autora dnia 23.08.16 o godzinie 11:07
Marzanna Szulta

Marzanna Szulta właściciel, Usługi
Informatyczne
SZULTASET

Temat: import pliku csv/txt i replace

Tych rekordów jest dużo? Ja robiłabym to w ten sposób, że pobrałabym tak jak jest, a następnie kodem VBA przerobiłabym wartości na akceptowalną postać. Można to zrobić albo w tej samej tabeli (ale wówczas nagłówki muszą pozostać) albo dołączając do innej tabeli.
Piotr Nowak

Piotr Nowak Kierownik Projektu
(Project Manager),
Orange Polska

Temat: import pliku csv/txt i replace

Tak, rekordów jest ponad 30.000 :)
Natomiast po kolejnych dziesiątkach minut różnych testów i poszukiwań najprostszego rozwiązania doszedłem do tego, że zamiast to co opisałem wcześniej, wystarczy zastąpić ciąg znaków
\"
ciągiem
""
i teraz szukam rozwiązania, jak automatycznie to zrobić przed importem nie ingerując w plik źródłowy. Testy oczywiście zrobiłem podmieniając ten ciąg znaków jak opisałem powyżej, ale chciał bym to jakoś "zautomatyzować". Dzięki Tobie, przyszedł mi do głowy pomysł, aby faktycznie spróbować zaimportować do nowej tabeli, cały plik "jak jest" pozostawiając jedynie ogranicznik pola jako średnik. W takim wypadku nagłówki kolumn będą miały nazwy Pole1, Pole2, Pole3, itd., ale czy przy tym imporcie jednak nie "utnie" rekordu po znaku backslash, to sprawdzę jutro.
Pozdrawiam
Piotr Nowak

Piotr Nowak Kierownik Projektu
(Project Manager),
Orange Polska

Temat: import pliku csv/txt i replace

Marzanna, DZIĘKI za natchnienie :)
Import powiódł się, W ten sposób powstał workround na tego "problemu".
Czyli wszystkie kroki są takie:
1) otrzymany plik CSV/txt z separatorem ŚREDNIK lub TABulator, z kwalifikatorem tekstu cudzysłów podwójny/zwykły " z nagłówkami kolumn w pierwszym wierszu i z ustalonym kodowaniem znaków
2) import (do tabeli tymczasowej) albo do nowej tabeli, albo do tabeli z nazwami pól: Pole1, Pole2, Pole3, itd. ale tylko z ograniczeniem na separator (bez wybierania co jest kwalifikatorem tekstu i bez oznaczania, że pierwszy wiersz zawiera nagłówki kolumn)
3) replace (na kolumnach w których spodziewany jest ten problematyczny backslash) ciągu \" na "
4) przeładowanie z tabeli tymczasowej do tabeli docelowej ale jako ciągi tekstowe bez pierwszego i bez ostatniego znaku w polu (którym jest cudzysłów) z pominięciem rekordu z nagłówkami, albo przed przeładowaniem, skasować ten rekord
5) skasowanie zawartości tabeli tymczasowej, aby była "przygotowana" do kolejnego importu.

Może ktoś z tego skorzysta w przyszłości, a teraz jestem pewien, że "najbezpieczniejszym" separatorem nie jest ŚREDNIK lecz TABulator :)

Pozdrawiam

Następna dyskusja:

Zabespieczenie pliku bazy- ...




Wyślij zaproszenie do