Roman Piekarski

Roman Piekarski Programista do
wynajęcia

Temat: problem z danymi z pliku csv

Witam,

Mam dziwny problem z ktorym sie jeszcze nie mialem okazji spotkac.
Jest sobie plik csv ktory zasysam poprzez mechanizm importu a jego zawartosc wiersz po wierszu leci do bazy danych. Zawartośc konwertowana jest do utf.
Problem pojawia se na etapie rezultatu pobrania danego wiersza pliku csv.

W rezultacie dostaje wszystkie wyrazy zaczynające się na "Ż" lub "Ł" w postaci "ary" lub "dź" (efekt ucinania wyrazów "Żary" i "Łódź").

Próbowałem już z różnym kodowaniem plików csv. Domyślnie był windows 1250, pozniej przekonvertowalem do iso 8859-2 i dalej ucina mi wyrazy.

Wyczerpalem juz limit pomysłów. Czy może ktoś spotkał się już z czymś takim?

PozdrawiamRoman Piekarski edytował(a) ten post dnia 26.09.10 o godzinie 08:42

konto usunięte

Temat: problem z danymi z pliku csv

UTF-8?

czemu nie ładujesz natywnym mechanizmem bazy? jest zdecydowanie szybciej
Roman Piekarski

Roman Piekarski Programista do
wynajęcia

Temat: problem z danymi z pliku csv

Przemysław R.:
UTF-8?

czemu nie ładujesz natywnym mechanizmem bazy? jest zdecydowanie szybciej

Akurat nie jest to teraz moj nawiekszy problem. Takie bylo zalozenie projektowe.
Dariusz Żukowski

Dariusz Żukowski [keczerad]
Programista z
zamiłowania.

Temat: problem z danymi z pliku csv

Roman Piekarski:
Witam,

Mam dziwny problem z ktorym sie jeszcze nie mialem okazji spotkac.
Jest sobie plik csv ktory zasysam poprzez mechanizm importu a jego zawartosc wiersz po wierszu leci do bazy danych. Zawartośc konwertowana jest do utf.
Problem pojawia se na etapie rezultatu pobrania danego wiersza pliku csv.

W rezultacie dostaje wszystkie wyrazy zaczynające się na "Ż" lub "Ł" w postaci "ary" lub "dź" (efekt ucinania wyrazów "Żary" i "Łódź").

Próbowałem już z różnym kodowaniem plików csv. Domyślnie był windows 1250, pozniej przekonvertowalem do iso 8859-2 i dalej ucina mi wyrazy.

Wyczerpalem juz limit pomysłów. Czy może ktoś spotkał się już z czymś takim?

PozdrawiamRoman Piekarski edytował(a) ten post dnia 26.09.10 o godzinie 08:42

Na podstawie tego co napisales, to trzeba miec szklaną kulę zeby coś pomóc. Wg mnie może to być problem w połączeniu z bazą danych i złym "encodingiem" polaczenia.

PS. Pokaz kod to sie moze pomoze.
Roman Piekarski

Roman Piekarski Programista do
wynajęcia

Temat: problem z danymi z pliku csv

Dariusz Ż.:

Nie czytasz uwaznie, dlatego masz problem z interpretacja tego co napisalem. W takich momentach naprawde potrzeba szklana kule. Nastepnym razem jezeli tak juz bardzo chcesz mnie zgnoic, przeczytaj uwaznie ponizszy tekst i sie zastanow czy nie powinienes sprostowac swojej wypowiedzi;)
Roman Piekarski:
Problem pojawia se na etapie rezultatu pobrania danego wiersza pliku csv.

W rezultacie dostaje wszystkie wyrazy zaczynające się na "Ż" lub "Ł" w postaci "ary" lub "dź" (efekt ucinania wyrazów "Żary" i "Łódź").

Czy teraz po przeczytaniu powyzszego tekstu Twoja szklana kula wskazala szarym komurkom kierunek? Jesli jeszcze nie zaiskrzylo to nie ma problemu:) Zwalmy niedyspozycje umyslu na niedzielnego kaca:)

Pozdrawiam

konto usunięte

Temat: problem z danymi z pliku csv

Roman, ucina tylko duże znaki polskiego alfabetu (Ł, Ż), bez różnicy gdzie występują w ciągu?

cvs to zwykły plik tekstowy i problem leży gdzieś w sposobie konwertowania jednego systemu znaków do innego.

Temat: problem z danymi z pliku csv

A stare:

$iso = array("177","230","234","179","241","243","182","188","191","161","198","202","163","209","211","166","172","175");
$win = array("185","230","234","179","241","243","156","159","191","165","198","202","163","209","211","140","143","175");

for ($i=0;$i<count($iso);$i++) $iso[$i]="/".chr($iso[$i])."/";
for ($i=0;$i<count($win);$i++) $win[$i]=chr($win[$i]);

a potem tylko wywołanie:

$_tekst = preg_replace($iso, $win, $NazwaTemat);

nie działa?
Może to nie eleganckie, ale przydaje się nieraz gdy muszę zmieniać kodowanie- zdarza się to gdy muszę wczytać dane pochodzące z innych systemów z dziwnym kodowaniem. Ale działa tam gdzie standardowe mechanizmy kodowania nie sprawdzają się.

Oczywiście kody trzeba pozmieniać z zależności od tego z czego i na co chcemy kodować, ale wystarczy wyświetlić na ekranie kod polskiego znaku (podmieniamy go w $iso) i wprowadzić (w $win) kod w jakim znak ma być zapisany.
Jak coś mam nowego to zaczytuję w pliku ciąg ąćę... i wyświetlam na ekranie wartości chr znaków (to kolejne wartości w $iso) a wartości znaków do zapisania to ten sam ciąg ąćę... kodowany tym co chcę zapisać już w ciągu $win.

Poniższy ciąg to konwersja z naszych znaków dialektycznych zapisanych w latin1 na win-1250 niezbędny do wyświetlenia w excelu (o ile dobrze pamiętam).

konto usunięte

Temat: problem z danymi z pliku csv

Krzysztof Praski:
A stare:

$iso = array("177","230","234","179","241","243","182","188","191","161","198","202","163","209","211","166","172","175");
$win = array("185","230","234","179","241","243","156","159","191","165","198","202","163","209","211","140","143","175");

for ($i=0;$i<count($iso);$i++)
> $iso[$i]="/".chr($iso[$i])."/";

for ($i=0;$i<count($win);$i++) $win[$i]=chr($win[$i]);
>
a potem tylko wywołanie:

$_tekst = preg_replace($iso, $win, $NazwaTemat);

nie działa?
Może to nie eleganckie, ale przydaje się nieraz gdy muszę zmieniać kodowanie- zdarza się to gdy muszę wczytać dane pochodzące z innych systemów z dziwnym kodowaniem. Ale działa tam gdzie standardowe mechanizmy kodowania nie sprawdzają się.

Oczywiście kody trzeba pozmieniać z zależności od tego z czego i na co chcemy kodować, ale wystarczy wyświetlić na ekranie kod polskiego znaku (podmieniamy go w $iso) i wprowadzić (w $win) kod w jakim znak ma być zapisany.
Jak coś mam nowego to zaczytuję w pliku ciąg ąćę... i wyświetlam na ekranie wartości chr znaków (to kolejne wartości w $iso) a wartości znaków do zapisania to ten sam ciąg ąćę... kodowany tym co chcę zapisać już w ciągu $win.

Poniższy ciąg to konwersja z naszych znaków dialektycznych zapisanych w latin1 na win-1250 niezbędny do wyświetlenia w excelu (o ile dobrze pamiętam).

$linia[0]=iconv("windows-1250","ISO-8859-2",$linia[0]);

secundo
excel jako taki ma pliki pinarne -> xls, lub XML -> xlsx, więc co najwyżej w ten sposób generujesz pliki csv akceptowane przez Excel-aPrzemysław R. edytował(a) ten post dnia 26.09.10 o godzinie 19:16

konto usunięte

Temat: problem z danymi z pliku csv

Przemysław R.:
$linia[0]=iconv("windows-1250","ISO-8859-2",$linia[0]);

nie miales nigdy problemow z iconv?

ja w pracy ciagle pisze swoje konwertery, bo co jakis czas iconv lubi sobie poleciec w kulki i wywalac sie na polskich ogonkach.

pytam calkiem serio.

Temat: problem z danymi z pliku csv

Tak iconv jest OK.
Ale życie z nim nie zawsze jest OK (często stawia mi opór), bo
1. musi być zainstalowane - jeżeli mamy dostęp do serwera jest OK, ale co gdy takiego nie mamy a system jest bez biblioteki iconv, choć dziś już ciężko o takie serwery to mimo wszystko... ?
2. Zestaw znaków musi być zgodny z biblioteką libiconv - a niestety tu jest ograniczona ilość zestawów znaków - jako Polacy mieliśmy niezły zapał do tworzenia własnych stron kodowych (zresztą światowe firmy nam pomagały) i z części systemów dane dostajemy jako csv z dość dziwnym niestandardowym zestawem znaków nieobsługiwanym przez tą bibliotekę (http://www.gnu.org/software/libiconv/), gdzie iconv nie pomoże.

Ale masz rację tam gdzie iconv się sprawdza ułatwia życie, ale jak nie działa korzystam z opisanego powyżej sposobu - on zawsze działa.

A i dołączam się do powyższej wypowiedzi. Też nie do końca ufam iconv, bo leci w kulki :)Krzysztof Praski edytował(a) ten post dnia 26.09.10 o godzinie 19:42

konto usunięte

Temat: problem z danymi z pliku csv

Wojciech Zbigniew Piotrowicz:
Przemysław R.:
$linia[0]=iconv("windows-1250","ISO-8859-2",$linia[0]);

nie miales nigdy problemow z iconv?

ja w pracy ciagle pisze swoje konwertery, bo co jakis czas iconv lubi sobie poleciec w kulki i wywalac sie na polskich ogonkach.

pytam calkiem serio.

akurat częściej stosuję ICONV w postaci zewnętrznej i ten nigdy mnie nie zawiódł. Nie miałem też problemów z przekodowaniem tekstu z UTF-a do CP1250 przy generowaniu XML-a z danymi dla Excel-a

Temat: problem z danymi z pliku csv

Ale czy zauważyłeś że piszę o kodowaniu polskich znaków zapisanych w latin1.
(jak by były w latin2 lub utf do iconv zadziała).
Tak się zdarza np. gdy dopisuje się dodatkowe narzędzia do istniejących. Znaczna część takich narzędzi jeśli korzysta z mysql'a to ma tablice w latin1.

konto usunięte

Temat: problem z danymi z pliku csv

ja procz latin1 koduje jeszcze do "dos cp-852" =)

konto usunięte

Temat: problem z danymi z pliku csv

Krzysztof Praski:
A stare:

$iso = array("177","230","234","179","241","243","182","188","191","161","198","202","163","209","211","166","172","175");
$win = array("185","230","234","179","241","243","156","159","191","165","198","202","163","209","211","140","143","175");

for ($i=0;$i<count($iso);$i++) $iso[$i]="/".chr($iso[$i])."/";
>
for ($i=0;$i<count($win);$i++) $win[$i]=chr($win[$i]);
>
a potem tylko wywołanie:

$_tekst = preg_replace($iso, $win, $NazwaTemat);

nie działa?
Może to nie eleganckie, ale przydaje się nieraz gdy muszę zmieniać kodowanie- zdarza się to gdy muszę wczytać dane pochodzące z innych systemów z dziwnym kodowaniem. Ale działa tam gdzie standardowe mechanizmy kodowania nie sprawdzają się.

Mam prawie tak samo aczkolwiek prościej / być może przez to szybciej:


// A: konwersja łańcuch-w-łańcuch
function dz_cp1250_to_iso8859_2($text)
{
$res = strtr($text, "ĄĘĆŁŃÓŚŹŻąęćłńóśźż", "ˇĘĆŁŃÓ¦¬Ż±ęćłń󶼿");
return($res);
}

// B: konwersja przy pomocy array
function dz_cp1250_to_utf8($text)
{
$win2utf = array(
"\xb9" => "\xc4\x85", "\xa5" => "\xc4\x84",
"\xe6" => "\xc4\x87", "\xc6" => "\xc4\x86",
"\xea" => "\xc4\x99", "\xca" => "\xc4\x98",
"\xb3" => "\xc5\x82", "\xa3" => "\xc5\x81",
"\xf3" => "\xc3\xb3", "\xd3" => "\xc3\x93",
"\x9c" => "\xc5\x9b", "\x8c" => "\xc5\x9a",
"\xbf" => "\xc5\xbc",
"\x8f" => "\xc5\xb9",
"\x9f" => "\xc5\xba",
"\xaf" => "\xc5\xbb",
"\xf1" => "\xc5\x84", "\xd1" => "\xc5\x83"
);

$res = strtr($text, $win2utf);
return($res);
}


Najlepiej chyba podawać znaki kodami, wtedy taka konwersja jest uniwersalna i otworzy się w każdym edytorze.
Roman Piekarski

Roman Piekarski Programista do
wynajęcia

Temat: problem z danymi z pliku csv

Kamil Brenk:
Roman, ucina tylko duże znaki polskiego alfabetu (Ł, Ż), bez różnicy gdzie występują w ciągu?

cvs to zwykły plik tekstowy i problem leży gdzieś w sposobie konwertowania jednego systemu znaków do innego.

Kamil do tego tez juz doszedlem;)
Nie stety nie jest to problem zachadzacy podczas procesu konwersji lecz na etapie fgetcsv(). Rezultat z tej funkcji zwraca mi juz poucinane wyrazy.
Chyba, ze fgetcsv parsuje w jakis znaczacy sposob stringi co moze miec wplyw na wynik wyjsciowy.

konto usunięte

Temat: problem z danymi z pliku csv

Wiem, że takie pytania mogą denerwować, ale muszę je zadać ;)
1. Czy sprawdziłeś w dowolnym edytorze (nie Excelu), czy te znaki rzeczywiście znajdują się w pliku? Może już ich nie ma w CSV po konwersji z formatu Excela?
2. Czy odczytywałeś pliki CSV w inny sposób, np file_get_contents? Czy w takim przypadku również nie było polskich znaków?

Jeśli oba powyższe sprawdziłeś i nadal nie ma polskich znaków, problem może leżeć w sposobie zapisania tych znaków w pliku csv. Bardzo możliwe, że Excel zapisał te znaki jako encje, a php w swej mądrości traktuje niektóre znaki tych encji jako podział wiersza/kolumny i usuwa resztę.
Dariusz Żukowski

Dariusz Żukowski [keczerad]
Programista z
zamiłowania.

Temat: problem z danymi z pliku csv

Roman Piekarski:
Kamil Brenk:
Roman, ucina tylko duże znaki polskiego alfabetu (Ł, Ż), bez różnicy gdzie występują w ciągu?

cvs to zwykły plik tekstowy i problem leży gdzieś w sposobie konwertowania jednego systemu znaków do innego.

Kamil do tego tez juz doszedlem;)
Nie stety nie jest to problem zachadzacy podczas procesu konwersji lecz na etapie fgetcsv(). Rezultat z tej funkcji zwraca mi juz poucinane wyrazy.
Chyba, ze fgetcsv parsuje w jakis znaczacy sposob stringi co moze miec wplyw na wynik wyjsciowy.

W tym momencie 20 osob ci pomaga i zadna do tej pory nie pomogła, to tak jakby lekarz (programista) wydawał diagnozę nie widząc pacjenta (kodu). Analogia jak najbardziej sie nadaje. Jeżeli dałbyś kod i przykładowy plik .csv sprawa do rozwiązanie w 30 sekund, ale ty wolisz brnać dalej, twoja wolna wola.
Krzysztof Kurzawa

Krzysztof Kurzawa Web / Mobile
Developer

Temat: problem z danymi z pliku csv

wyrzucałeś sobie zapytania SQL na stronę? Bo czy są prawidłowe zależy po której stronie stoi problem. Tak mi się wydaje.
Roman Piekarski

Roman Piekarski Programista do
wynajęcia

Temat: problem z danymi z pliku csv

Krzysztof Kurzawa:
wyrzucałeś sobie zapytania SQL na stronę? Bo czy są prawidłowe zależy po której stronie stoi problem. Tak mi się wydaje.

Panowie, powtarzam po raz drugi: "Problem nie pojawia sie na etapie polaczenia z baza danych lecz na etapie rezultatu z fgetcsv".

Generalnie jestem juz bliski rozwiazania tego problemu. Sprawa jest glebsza niz sie spodziewalem. Napisze wam dzisiaj do czego doszedlem.

Pozdrawiam

konto usunięte

Temat: problem z danymi z pliku csv

Generalnie jestem juz bliski rozwiazania tego problemu. Sprawa jest glebsza niz sie spodziewalem. Napisze wam dzisiaj do czego doszedlem.

Jak otwierasz ten CSV zanim przekazesz uchwyt do fgetcsv()? W trybie binarnym? Jesli nie, to moze Ci mieszac "locale" serwera, co zreszta jest wspomniane w dokumentacji:


Locale setting is taken into account by this function. If LANG is e.g. en_US.UTF-8, files in one-byte encoding are read wrong by this function.


IMHO, oczywiscie.

Następna dyskusja:

Problem z pobieraniem pliku...




Wyślij zaproszenie do