Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кодировка и проблемы с ней, DBF to DBF 
V
    Опции темы
agR
Дата 20.7.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.7.2006
Где: Киев

Репутация: 2
Всего: 2



Необходимо один DBF файл разбить на несколько других. То есть часть инфы в одну сторону, а часть - в другую.
Для чтения данных использую мост jdbc:odbc , а для создания новых DBF-ок приходится пользоваться JavaDBF, т.к. оказывается нормально создать табличку jdbc:odbc не в состоянии (зато хоть читает норм ;)). 
Исходный файл содержит кириллицу, которая в новых файлах отображается в виде "???" и др. символах (в зависимости от кодировки).
Перебрал уйму кодировок, но так и не привел строки в чувство.
По идее файл имеет кодировку cp866 (DOS),  для чтения использую такое соединение:
Код

public static Connection createConnection() throws Exception {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Properties connInfo = new Properties();
        connInfo.put("charSet","cp866");
        String url = "jdbc:odbc:Driver={Microsoft dBase Driver (*.dbf)};DBQ=C:\\MAT_NEW\\BASE";
        Connection con = DriverManager.getConnection(url,connInfo);
        return con;
    }

потом в массив заношу значения:
Код

oldString[0][i-2] = rs.getString(2); // rs - ResultSet rs = st.executeQuery("SELECT * FROM OF.DBF");

Для записи пользуюсь классом:
Код

class WriteDBF {
    DBFdeCoder fr = new DBFdeCoder();
    public WriteDBF() throws DBFException, FileNotFoundException, IOException {
        
        String[][] oldString = fr.getOldString();
        
        DBFWriter writer = new DBFWriter();
        DBFField[] fields = new DBFField[18];
        
        //NAME
        fields[0] = new DBFField();
        fields[0].setName("NAME");
        fields[0].setDataType(DBFField.FIELD_TYPE_C);
        fields[0].setFieldLength(40);
        
        //NNOM
        fields[1] = new DBFField();
        fields[1].setName("NNOM");
        fields[1].setDataType(DBFField.FIELD_TYPE_C);
        fields[1].setFieldLength(10);
        
        //PERSON
        fields[2] = new DBFField();
        fields[2].setName("PERSON");
        fields[2].setDataType(DBFField.FIELD_TYPE_C);
        fields[2].setFieldLength(20);
        
        //CEX
        fields[3] = new DBFField();
        fields[3].setName("CEX");
        fields[3].setDataType(DBFField.FIELD_TYPE_C);
        fields[3].setFieldLength(20);
        
        //DAT
        fields[4] = new DBFField();
        fields[4].setName("DAT");
        fields[4].setDataType(DBFField.FIELD_TYPE_D);
        
        //GROUP
        fields[5] = new DBFField();
        fields[5].setName("GROUP");
        fields[5].setDataType(DBFField.FIELD_TYPE_C);
        fields[5].setFieldLength(1);
        
        //NAZNACH
        fields[6] = new DBFField();
        fields[6].setName("NAZNACH");
        fields[6].setDataType(DBFField.FIELD_TYPE_C);
        fields[6].setFieldLength(1);
        
        //ARENDA
        fields[7] = new DBFField();
        fields[7].setName("ARENDA");
        fields[7].setDataType(DBFField.FIELD_TYPE_C);
        fields[7].setFieldLength(1);
        
        //STATUS
        fields[8] = new DBFField();
        fields[8].setName("STATUS");
        fields[8].setDataType(DBFField.FIELD_TYPE_C);
        fields[8].setFieldLength(1);
        
        //KOEF
        fields[9] = new DBFField();
        fields[9].setName("KOEF");
        fields[9].setDataType(DBFField.FIELD_TYPE_N);
        fields[9].setFieldLength(13);
        fields[9].setDecimalCount(6);
        
        //KINDEX
        fields[10] = new DBFField();
        fields[10].setName("KINDEX");
        fields[10].setDataType(DBFField.FIELD_TYPE_N);
        fields[10].setFieldLength(13);
        fields[10].setDecimalCount(6);
        
        //DRAG_MET
        fields[11] = new DBFField();
        fields[11].setName("DRAG_MET");
        fields[11].setDataType(DBFField.FIELD_TYPE_N);
        fields[11].setFieldLength(13);
        fields[11].setDecimalCount(6);
        
        //NOTE
        fields[12] = new DBFField();
        fields[12].setName("NOTE");
        fields[12].setDataType(DBFField.FIELD_TYPE_C);
        fields[12].setFieldLength(160);
        
        //CODE
        fields[13] = new DBFField();
        fields[13].setName("CODE");
        fields[13].setDataType(DBFField.FIELD_TYPE_C);
        fields[13].setFieldLength(12);
        
        //SUMPR
        fields[14] = new DBFField();
        fields[14].setName("SUMPR");
        fields[14].setDataType(DBFField.FIELD_TYPE_N);
        fields[14].setFieldLength(16);
        fields[14].setDecimalCount(2);
        
        //SHET
        fields[15] = new DBFField();
        fields[15].setName("SHET");
        fields[15].setDataType(DBFField.FIELD_TYPE_C);
        fields[15].setFieldLength(6);
        
        //TYP
        fields[16] = new DBFField();
        fields[16].setName("TYP");
        fields[16].setDataType(DBFField.FIELD_TYPE_C);
        fields[16].setFieldLength(1);
        
        //SCH_Z
        fields[17] = new DBFField();
        fields[17].setName("SCH_Z");
        fields[17].setDataType(DBFField.FIELD_TYPE_C);
        fields[17].setFieldLength(6);
        
        writer.setFields(fields);
        Date now = new Date();
        Object rowData[] = new Object[18];
        rowData[0] = "1.name";
        rowData[1] = "2.nnom";
        rowData[2] = "3.person";
        rowData[3] = "4.cex";
        rowData[4] = now;
        rowData[5] = "1";
        rowData[6] = "1";
        rowData[7] = "1";
        rowData[8] = "1";
        rowData[9] = new Double(1.5);
        rowData[10] = new Double(1.5);
        rowData[11] = new Double(1.5);
        //rowData[12] = new String(oldString[0][51].getBytes("***"),"***"); что тока не подставлял =\
        rowData[12] = oldString[0][51];
        rowData[13] = "14.code";
        rowData[14] = new Double(5000.0);
        rowData[15] = "15.sc";
        rowData[16] = "1";
        rowData[17] = "16.sch";
        writer.addRecord(rowData);
        //OutputStreamWriter fos = new OutputStreamWriter(new FileOutputStream("C:\\MAT_NEW\\BASE\\OSN_NEW.DBF", true), "cp1251"));
        FileOutputStream fos = new FileOutputStream("C:\\MAT_NEW\\BASE\\OSN_NEW.DBF");
        writer.write(fos);
        fos.close();
                
    }
}

в файле OSN_NEW.DBF 13 поле будет отображено неправильно. То же будет и с другими полями если в них ввести кириллицу.
Помогите плз...
П.С. Если не выйдет заставят делать на Delphi..... не дайте им сделать это!  smile 

PM MAIL ICQ   Вверх
fixxer
Дата 20.7.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Это одноразовая процедура, или нужно делать периодически?

Во-первых, проверьте, а читаются даные корректно? (в rs.getString(2)).

Для работы с dbf через JDBC-ODBC рекомендую http://download.microsoft.com/download/vfo...-US/VFPODBC.msi

Это сообщение отредактировал(а) fixxer - 20.7.2007, 12:47


--------------------
user posted image
PM MAIL ICQ   Вверх
AntonSaburov
Дата 20.7.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



А разве кодовая страница не cp1251 ?
PM MAIL WWW ICQ   Вверх
fixxer
Дата 20.7.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Цитата(AntonSaburov @ 20.7.2007,  12:41)
А разве кодовая страница не cp1251 ?

Смотря как/где файлик сделан. Если в FoxPro 2.6, то запросто 866.

agR, опишите задачи поподробнее, возможно удастся обойтись "INSERT INTO ... SELECT ... FROM ... WHERE ..."

Это сообщение отредактировал(а) fixxer - 20.7.2007, 12:51


--------------------
user posted image
PM MAIL ICQ   Вверх
agR
Дата 20.7.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.7.2006
Где: Киев

Репутация: 2
Всего: 2



Цитата(fixxer @  20.7.2007,  12:35 Найти цитируемый пост)
Это одноразовая процедура, или нужно делать периодически?

Одноразовая... типа старое в новое, а потом идет работа с новым, а на старое забивается.
Цитата(fixxer @  20.7.2007,  12:35 Найти цитируемый пост)
Во-первых, проверьте, а читаются даные корректно? (в rs.getString(2)).

Все читается корректно. Ставил в charSet cp1251 - в консоли выглядит так как надо.
Цитата(AntonSaburov @  20.7.2007,  12:41 Найти цитируемый пост)
А разве кодовая страница не cp1251 ? 

Где, кем и как создавалась база мне не известно, хотя процентов 60-70 в каком-то DOS-приложении.
PM MAIL ICQ   Вверх
fixxer
Дата 20.7.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Если одноразовая, то проще всего взять Visual FoxPro и все сделать там. (Даже чисто на SQL'е)


--------------------
user posted image
PM MAIL ICQ   Вверх
agR
Дата 20.7.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.7.2006
Где: Киев

Репутация: 2
Всего: 2



Цитата(fixxer @  20.7.2007,  13:01 Найти цитируемый пост)
Если одноразовая, то проще всего взять Visual FoxPro и все сделать там. (Даже чисто на SQL'е) 

В том то и дело, что делать это буду не я.
То есть моя задача написать прогу, а люди потыкав на кнопки получат результат.
В общем программка необходима smile
PM MAIL ICQ   Вверх
agR
Дата 20.7.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.7.2006
Где: Киев

Репутация: 2
Всего: 2



Цитата(fixxer @  20.7.2007,  12:48 Найти цитируемый пост)
agR, опишите задачи поподробнее, возможно удастся обойтись "INSERT INTO ... SELECT ... FROM ... WHERE ..."

Хммм.... в jdbc:odbc я не уверен, т.к. если он базу создать не может, то где гарантия, что он и строки нормально вставит. Хотя читает он хорошо.  
PM MAIL ICQ   Вверх
fixxer
Дата 20.7.2007, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Я Вам дал ссылку на драйвер. Он должен поддерживать расширенный синтаксис SQL

А как Вы таблицу пробовали создать? Через DDL?

Это сообщение отредактировал(а) fixxer - 20.7.2007, 13:47


--------------------
user posted image
PM MAIL ICQ   Вверх
agR
Дата 20.7.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.7.2006
Где: Киев

Репутация: 2
Всего: 2



Цитата(fixxer @  20.7.2007,  13:44 Найти цитируемый пост)
А как Вы таблицу пробовали создать? Через DDL?

Нет.
Создание написано в первом посте после слов:
Цитата(agR @  20.7.2007,  12:27 Найти цитируемый пост)
Для записи пользуюсь классом:

Вот так и создаю. JavaDBF работает через свои методы.
Код


        .........

        writer.addRecord(rowData);
        FileOutputStream fos = new FileOutputStream("C:\\MAT_NEW\\BASE\\OSN_NEW.DBF");
        writer.write(fos);
        fos.close();

        .........



Цитата(fixxer @  20.7.2007,  13:44 Найти цитируемый пост)
Я Вам дал ссылку на драйвер. Он должен поддерживать расширенный синтаксис SQL

Спасибо. Сейчас будем смотреть.
PM MAIL ICQ   Вверх
fixxer
Дата 20.7.2007, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Цитата(agR @ 20.7.2007,  13:55)
Цитата(fixxer @  20.7.2007,  13:44 Найти цитируемый пост)
А как Вы таблицу пробовали создать? Через DDL?

Нет.
Создание написано в первом посте после слов:
Цитата(agR @  20.7.2007,  12:27 Найти цитируемый пост)
Для записи пользуюсь классом:

Вот так и создаю. JavaDBF работает через свои методы.
Код


        .........

        writer.addRecord(rowData);
        FileOutputStream fos = new FileOutputStream("C:\\MAT_NEW\\BASE\\OSN_NEW.DBF");
        writer.write(fos);
        fos.close();

        .........



Нет, когда пробовали через jdbc:odbc

Добавлено через 1 минуту и 31 секунду
Вообще подозреваю, что дело в JavaDBF. Он запросто может не прописывать кодовую страницу в файл.


--------------------
user posted image
PM MAIL ICQ   Вверх
agR
Дата 20.7.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.7.2006
Где: Киев

Репутация: 2
Всего: 2



Вот тут я тогда описал проблему.
Где-то потом прочитал, что jdbc:odbc на данный момент поддерживает лишь корректное чтение.

Есть метод setCharactersetName(), но он походу не работает.  smile
 

Это сообщение отредактировал(а) agR - 20.7.2007, 14:14
PM MAIL ICQ   Вверх
fixxer
Дата 20.7.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



О! А вы javadoc на JavaDBF читали? У суперкласса DBFWriter'а DBFBase есть метод setCharactersetName(String). Моя чувствительная жопа подсказывает, что это должно помочь. Правда не уверен в том в каком формате нужно задавать это имя. Поиграйтесь, посмотрите доки.

Это сообщение отредактировал(а) fixxer - 20.7.2007, 14:14


--------------------
user posted image
PM MAIL ICQ   Вверх
agR
Дата 20.7.2007, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.7.2006
Где: Киев

Репутация: 2
Всего: 2



Цитата(fixxer @  20.7.2007,  14:13 Найти цитируемый пост)
Поиграйтесь, посмотрите доки.

Этим сейчас и занимаюсь smile

Добавлено через 4 минуты и 1 секунду
Цитата(agR @  20.7.2007,  14:02 Найти цитируемый пост)
Есть метод setCharactersetName(), но он походу не работает.  smile

Так и есть, он не работает. Ставил ср1251 и ср866
Проверил при помощи проги - файлы идентичны.

Это сообщение отредактировал(а) agR - 20.7.2007, 14:15
PM MAIL ICQ   Вверх
fixxer
Дата 20.7.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Цитата(agR @ 20.7.2007,  14:15)
Так и есть, он не работает. Ставил ср1251 и ср866
Проверил при помощи проги - файлы идентичны.

А вот и неправда Ваша. Работает. Как cp1251 так и cp866.
Пример содрал из туториала, только заменил поле во второй записи на русское слово "Тест"

Код

import com.linuxense.javadbf.*;
import java.io.*;

public class DBFWriterTest {

  public static void main( String args[])
  throws DBFException, IOException {

    // let us create field definitions first
    // we will go for 3 fields
    //
    DBFField fields[] = new DBFField[ 3];

    fields[0] = new DBFField();
    fields[0].setName( "emp_code");
    fields[0].setDataType( DBFField.FIELD_TYPE_C);
    fields[0].setFieldLength( 10);

    fields[1] = new DBFField();
    fields[1].setName( "emp_name");
    fields[1].setDataType( DBFField.FIELD_TYPE_C);
    fields[1].setFieldLength( 20);

    fields[2] = new DBFField();
    fields[2].setName( "salary");
    fields[2].setDataType( DBFField.FIELD_TYPE_N);
    fields[2].setFieldLength( 12);
    fields[2].setDecimalCount( 2);

    DBFWriter writer = new DBFWriter();
    writer.setCharactersetName("cp866");
    writer.setFields( fields);

    // now populate DBFWriter
    //

    Object rowData[] = new Object[3];
    rowData[0] = "1000";
    rowData[1] = "John";
    rowData[2] = new Double( 5000.00);

    writer.addRecord( rowData);

    rowData = new Object[3];
    rowData[0] = "1001";
    rowData[1] = "\u0422\u0435\u0441\u0442";
    rowData[2] = new Double( 3400.00);

    writer.addRecord( rowData);

    rowData = new Object[3];
    rowData[0] = "1002";
    rowData[1] = "Rohit";
    rowData[2] = new Double( 7350.00);

    writer.addRecord( rowData);

    FileOutputStream fos = new FileOutputStream( args[0]);
    writer.write( fos);
    fos.close();
  }
}



--------------------
user posted image
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.