Problem z plikami .dbf

0

Witam, troche sfrustrowany jestem brakiem odpowiedzi na innych forach, to moze tutaj znajdzie sie akurat ktos w temacie.

Witam.
Mam pewien problem z wyciaganiem i przetwarzaniem danych pochodzacych z plikow .dbf (dBase III plus). Sposob jakim wyciagam wszystkie dane z pliku:

[code]
OleDbConnectionStringBuilder lv_build = new OleDbConnectionStringBuilder();
lv_build.Provider = "Microsoft.Jet.OLEDB.4.0";
lv_build.DataSource = directory_name;
OleDbConnection lv_con = new OleDbConnection(lv_build.ToString() + ";Extended Properties=dBASE IV;");
String l_str_query = "SELECT * FROM " + file_name + ""; //file_name - nazwa pliku
OleDbDataAdapter lv_adap = new OleDbDataAdapter(l_str_query, lv_con);
DataSet lv_ds = new DataSet();
lv_adap.Fill(lv_ds);
[/code]

I niby wszystko ok, dane sa wyciagniete. Tylko ze polskie znaki, ktore sa w nich sa w formie 'krzaczkow'. Musze z tej bazy wyciagac niektore dane, a niektore zmieniac. Ale niestety nie jestem w stanie wyszukiwac poprawnie, w przypadku gdy w klauzuli selekcji pojawiaja sie krzaczki. To znaczy gdy musze porownac "... WHERE col_1='ążńó'" w przypadku gdy col_1 zawiera krzaczaki, znaki nie sa sobie rowne.

Myslalem ze rozwiazalem problem, robiac cos takiego:
[code]
class libEncode
{
private const String lv_src = "windows-1250";
private const String lv_dst = "ibm852";

    static public String Get(String str)
    {
        return Encoding.GetEncoding(lv_dst).GetString(Encoding.GetEncoding(lv_src).GetBytes(str));
    }
}

[/code]
Niby dla niektorych przypadkow dzialalo i moglem robic:

[code]
String lv_query = "... WHERE col_1='"+ libEncode.Get("ń") +"'";
[/code]

No ale jak sie okazalo, jednak tylko dla niektorych polskich znakow trafilem w to kodowanie. Problem pozostal, tylko ze nie moge znalezc kodowania, ktore 'trafi' w te, ktore jest wykorzystane w pliku. Nawet po napisaniu:

[code]
String l_str_check = "ąćńół"; //string do sprawdzenia wyciagniety z .dbf, przypisanie ma charakter symboliczny zebyscie wiedzieli co tam jest
foreach (EncodingInfo ei1 in Encoding.GetEncodings())
{
foreach (EncodingInfo ei2 in Encoding.GetEncodings())
{
String l_str_compare = "ąćńół";
l_str_compare = Encoding.GetEncoding(el1.CodePage).GetString(Encoding.GetEncoding(el2.CodePage).GetBytes(l_str_compare));
if(l_str_check.Equals(l_str_compare)) MessageBox.Show("El1: "+ el1.CodePage +" El2: "+ el2.CodePage);
}
}
[/code]

Wybralem sobie kilka przykladowych kolumn z polskimi znakami, tak zeby sprawdzic jak najwiecej. Napisalem ich odpowiedniki (tak jak w powyzszym przykladzie l_str_compare). No i klops - nie moge znalezc tego kodowania.

Moze to jakos naprowadzi kogos z Was: Sciagnalem tez 3 programy do podgladania plikow .DBF (np DBF Viewer czy DBF Lister (do totalcmd)) i wszystkie poprawnie wyswietlaja polskie znaki. Istnieje tam opcja nazywana "DOS/ANSI" lub "Use OEM characters", ktora zamienia widok z krzaczkow, ktore ja widze, na polskie znaki:
[quote]
Use OEM characters
Hot key: F12
If set ON use OEM characters
[/quote]

Edit 1:

Z napisaniem wlasnej funkcji tez mam problem...

[code]
class libEncode
{
private const String lv_dbase_src = "ąĄćĆęĘłŁńŃóÓżŻźŹ";
private const String lv_dbase_dst2 = "¦ąŠĂŕ¦-ú˝ĐˇË¬»čĆ";
private const String lv_dbase_dst = "1YaAeE3LnNóÓ?—Y?";

    static public String dBase(String str)
    {
        for (int i = 0; i < lv_dbase_src.Length; i++)
        {
            str = str.Replace(lv_dbase_src[i], lv_dbase_dst[i]);
        }
        return str;
    }
}

[/code]

lv_dbase_dst2 to ciag wyciagniety z DBF Viewer
lv_dbase_dst to ciag wyciagniety z DataSetu do wyciagniecia wszystkiego.
Przy okazji Visual poprosil o zmiane strony kodowej bo nie wszystkie znaki mozna zakodowac.. no i znowu.. wybralem inna strone kodowa i znowu klops. Troche mnie to meczy. Musi byc przeciez inny sposob pracy na tych dbf

Edit 2:
Dotarlem do funkcji CharToOem oraz OemToChar z user32.dll

[code]

    [DllImport("user32.dll")]
    static extern bool CharToOem(byte[] lpszSrc, byte[] lpszDst);

function void Bum() {
    ArrayList done = new ArrayList();
        foreach (EncodingInfo ei1 in Encoding.GetEncodings())
        {
            foreach (EncodingInfo ei2 in Encoding.GetEncodings())
            {
                foreach (String cur in al) //al zawiera stringi, ktore sam napisalem z polskimi znakami na zasadzie al.Add("ąćń") etc., a ktore odpowiadaja ciagom z .dbf
                {
                    byte[] byt_1 = Encoding.GetEncoding(ei1.CodePage).GetBytes(cur.ToUpper());
                    byte[] byt_2 = new byte[byt_1.Length];
                    CharToOem(byt_1, byt_2);
                    String str = Encoding.GetEncoding(ei2.CodePage).GetString(byt_2);
                    done.Add(str);
                }
            }
        }
        foreach (DataRow cur in ds.Tables[0].Rows) //wartosci z polskimi znakami z DataSet
        {
            String value = ((String)cur[0]);
            if(!done.Contains(value)) {
                MessageBox.Show("BRAK: "+ value);
            }
            else MessageBox.Show("Jest: " + value);
        }
    }

[/code]

Ponownie dalem zagniezdzone petle bo juz mi nerwy puszczaja... kolejny raz klapa. Posrod 176 400 roznie zapisanych wersji tych slow, nie znalazly sie takie, ktore by pasowaly...

Ma ktos jakies podpowiedzi jak mozna rozwiazac problem, tak, bym mogl swobodnie korzystac z polskich znakow w tym .dbf? Dodam ze nie moge konwertowac tego .dbf na inna strone kodowa - plik .dbf i jego strona kodowa musza zostac nieruszone (sa wykorzystywane przez inny, istniejacy juz program ktorego nie moge modyfikowac).

0

Skoro nie mozna zmieniac nic w tabeli zrodlowej to po prostu zrob sobie wlasna, kopie tamtej. Przenos do niej nowe rekordy (aktualizuj ją) i we własnej tabeli podczas aktualizacji zmieniaj "'krzaczki" na poprawne znaki. Z własnej tabeli mozesz teraz bez problemu pisac: "... WHERE col_1='ążńó'

pzdr. Artur

0

Witam
Hmm. Troche sie nie zrozumielismy. Albo niekomunikatywnie napisalem problem albo niedokladnie przeczytales. Jakkolwiek problem nie jest rzedu problemow, ktore zostaly napisanego tego samego dnia co ten post 'jak dzielic stringa' :P
W chwili obecnej nie mam wystarczajaco czasu by zajac sie tym problemem, ale skontaktowala sie ze mna osoba, ktora najwyrazniej bedzie mogla pomoc w tej sprawie.

Dziekuje mimo wszystko za zainteresowanie.
Pozdrawiam

0

Hej, kolego !
jeżeli w końcu znalazłeś rozwiązanie tej konwersji znaków z pliku dbf to podeślij proszę.
[email protected]
pozdrawiam

0

Witam,

Podobnie jak Ty wykonałem podobne testy zanim napisałem ten post. I podobnie jak Ty nic mi to nie dało.

Będę wdzięczny za opis rozwiązania tego problemu, jeżeli udało Ci się go uzyskać.

0

Witam

Mam ten sam problem. Może ktoś na to zaradzić bo też się męczę i nie mogę pobrać poprawnych danych. Jakie kodowanie ma dBase III.

0

Mam w domu dBaseIII, utworzyłem nowy plik, dopisałem coś z polskimi literami. Kodowanie jest Latin 2.

0

W bazie otwartej managerem są polskie litery, w Excelu również są. Czytając tabele przez OLEDB za pomocą IDataReader i metodzie GetString już pobiera błędne dane (czyli z krzaczkami). Nie mam już do tego siły:)....

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