Piszę moduł do importu plików z Krakowskiego Banku Spółdzielczego.
Zaczytuję CSV z danymi przelewów. Rozdzielenie pól tabulatorem najwyraźniej przerosło ichniejszych Panów Informatyków, bo wpadli na pomysł, żeby pola przelewu rozdzielać zwykłym przecinkiem. Nie no, serio! A ty, misiu kanterpartyjny, weź pisz ify albo obsługuj wyjątki i sprawdzaj każdorazowo, czy to coś, co odseparowałeś przecinkami, jest kwotą przelewu, politykiem ONR, nóżką dziecka, czy fragmentem adresu [bo przecież adresy formatowane przez obsługę na dziko albo kwiatki typu „Fundacja Rozwoju, Rozboju i Rozstroju” albo ‚ul. Tadeusza „Grota” Roweckiego’ zdarzają się tylko teoretycznie i na pewno nie w Naszym Wiodącym Banku, Będącym Liderem Rynku w Obszarze, prawda?].
[Z tą kwotą przelewu co prawda przesadziłem, bo w podwójnych cudzychlapkach jest, ale za to nazwa beneficjenta jest w poczwórnych. A ja dziwię się, że przy parsowaniu tego czegoś algorytm zaczyna uprawiać mi dziki seks.]
[Zresztą… „cieszmy się z małych rzeczy”. Taki np. HSBC nie udostępniał dla planktonu żadnych plików pośrednich, przynajmniej jeszcze do niedawna.]
Panowie programiści stłukli za to coś ciężką kasę. Aż strach pomyśleć, na ile opiewałaby faktura, gdyby przyszło im do głowy porozdzielanie pól zwyczajnym tabulatorem. Przygodne wróbelki donoszą o fakturach na przygotowanie tu i ówdzie JPK na pięciocyfrowe kwoty.
W euro.
Co ja tutaj robię, na styku ochnastu dyscyplin, ze swoją interdyscyplinarną wiedzą może i połebkową, ale za to sięgającą DOSa? Albo też: może i sięgającą DOSa, ale połebkową?
Co ja robię ze swoim życiem?
A to nie jest po prostu PLI (http://www.bph.pl/repo/bph/korporacje/bankowosc_elektroniczna/BusinessNet/Formaty_plikow/opis_formatu_pliku_platnosci_krajowych_pli.pdf)? Swego czasu robiłem eksport przelewów do formatu, który sobie życzył Raiffeisen i też odsądzałem ich pod nosem od czci i wiary (a to że kodowanie przedpotopowe, a to że dzielenie separatorem w ramach jednego pola, a to że przecinki właśnie, itp.), a okazało się, że to po prostu stary bankowy standard i większość banków się na nim opiera przy wymianie danych o przelewach.
PolubieniePolubienie
Nie.
PolubieniePolubienie
Z głowy piszę, ale CSV _chyba_ przewiduje opakowanie pól w „ciapki”, jeśli zawierają separator. Zresztą coś o ciapkach piszesz… A wtedy nie jest źle.
W jednej z firm spotkałem coś podobnego. Dane klientów były eksportowane do dziwnego formatu. Trudność była podobna, bo kupy się to nie trzymało, ale wynikało z tego, że kolumna e-mail zamiast jednego potrafiła zawierać wiele maili. Albo była pusta, a email leżał w kolumnie adres. Ogólnie: wprowadzający dostawał pola do wypełnienia i robił co chciał. 😉
IIRC sprawdziło się skrzyżowanie splita na separatorach, sprawdzenia ilości otrzymanych pól, i na tej podstawie ify i parsowanie regexpem. Przy czym miałem ten komfort, że potrzebowałem tylko maili, @ jest dość unikatowym znakiem i w skrajnie niepasujących przypadkach mogłem zlecić poprawienie danych w bazie.
PolubieniePolubienie
@rozie: nie napisałem, że sobie z tym nie poradziłem 🙂 Tylko, że wyjściem praktykowanym już przez większość cywilizowanych banków są po prostu tabulatory, nawet jeśli nie jest to do końca zgodne z RFC. Bo po tabulatorze możesz zrobić split i już, a przy ograniczaniu pól choćby przecinkami tak czy siak trzeba kombinować, tutaj wywalić podwójny cudzysłów, tam zignorować przecinek, bo leży pomiędzy cusłowami, a wszystko na końcu i tak zwalidować.
Ewentualnie mt940, który też jest już dziadowskim standardem, ale pomimo swojej dowolności – w zasadniczych sprawach udokumentowanym jednak dość dobrze.
Szczęście w nieszczęściu, że to wciąż banki, a nie import czyjejś ręcznej klepaniny z arkusza…
PolubieniePolubienie
Ale wiesz, że CSV znaczy *Comma* Separated Values? 😉
PolubieniePolubienie
Nazwa nazwą, ale jest RFC (4180).
PolubieniePolubienie
Ojtam ojtam, w moich okolicach CSV używa się ogólnie po prostu na określenie pliku tekstowego o [z grubsza] stałej strukturze rekordu. Co to znaczy expressis verbis, to ja wiem.
A istnienie specu to jeszcze nie powód, żeby nie zastosować rozwiązania po prostu praktyczniejszego. Nikt mi nie wmówi, że eskejpowanie np. przecinków w jakiejkolwiek formie [if any…] jest łatwiejsze w obsłudze od obsługi separacji niewspieranym w żadnym RFC tabulatorem.
PolubieniePolubienie
Ło matko. Retoryka rodem z MS. Też swoje „lepsze standardy” wprowadzali. Kto z NNTP albo maili korzystał, ten wie…
PolubieniePolubienie
Jakkolwiek byś nie kombinował, zawsze będziesz mieć te same problemy. Przecinek, tabulator, co za różnica? Chyba że przerzucisz się z formatu tekstowego na binarny 🙂
PolubieniePolubienie
Binarny format też nic nie zmieni. Ilość bajtów, little/big endian… 😉
PolubieniePolubienie
@rozie: to, co piszesz, miałoby sens, gdyby istniał jeden ogólnie przyjęty format eksportu danych z wyciągów bankowych. A tak nawet samo najbliższe standardowi, czyli mt940, ma w praktycznej implementacji ochnaście odmian, do tego dochodzi jeszcze wspomniane [pseudo]CSV i chyba jeszcze parę formatów autorskich, więc standardu brak. A jeśli faktycznego standardu brak, dev z głową mógłby zakodować to tak, żeby było lekko, miło i przyjemnie. Nie jest.
@kronikaparanoika: Owszem, jest różnica. Plik bankowy przenosi pozycje wyciągu bankowego, gdzie tabulatory w naturze nie występują, natomiast przecinki i cudzysłowy w nazwach – i owszem.
PolubieniePolubienie
Nie no, do tego banku jest – jak rozumiem – jeden format. Ja bym pewnie po prostu robił biblioteki per bank (ew. bank + format, jeśli mają więcej niż jeden). Ale nie jestem programistą. 😉
PolubieniePolubienie