импорт CSV в базу данных MySQL - как прочитать файл с польскими символами? - PullRequest
1 голос
/ 11 июля 2019

У меня есть CSV-файл, в котором также есть Польские символы . Содержание этого здесь:

ID_WORKER;FNAME;LNAME;WORKERS_GROUP;POSITION;
1;Paweł;ĄąĆćĘꣳŃńÓ󌜏źŻż;IT;IT Specialist;
6;Dawid;ĄąĆćĘꣳŃńÓ󌜏źŻż;Technologists;Technologists;
8;Maciej;ĄąĆćĘꣳŃńÓ󌜏źŻż;Storekeepers;Storekeeper;

Как вы видите, у него есть такие символы, как "Ąą Ćć Ęę Łł Ńń Óó Śś Źź Żż". Затем я импортирую CSV-файл с кодом ниже:

private DataTable ImportFile()
{
    DataTable imported_data = new DataTable();

    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Title = "Open csv file";
    ofd.DefaultExt = "*.csv";
    ofd.Filter = "Documents (*.csv)|*.csv";
    ofd.ShowDialog();

    FileInfo fi = new FileInfo(ofd.FileName);
    string FileName1 = ofd.FileName;
    string excel = fi.FullName;

    using(StreamReader sr = new StreamReader(excel, Encoding.Default))
    {
        string header = sr.ReadLine();
        if (string.IsNullOrEmpty(header))
        {
            MessageBox.Show("Not found or loaded not correct file.");
            return null;
        }

        string[] header_columns = header.Split(',');
        foreach(string header_column in header_columns)
        {
            imported_data.Columns.Add(header);
        }

        while (!sr.EndOfStream)
        {
            string line = sr.ReadLine();

            if (string.IsNullOrEmpty(linia)) continue;

            string[] fields = line.Split(',');
            DataRow imported_row = imported_data.NewRow();

            for (int i = 0; i < fields.Count(); i++)
            {
                imported_row[i] = fields[i];
            }

            imported_data.Rows.Add(imported_row);
        }
    }
    return imported_data;
}

И когда я вставляю импортированные данные со всем содержимым из CSV-файла в базу данных с кодом ниже:

private void save_modules(DataTable imported_data)
{
    string connection = "datasource=localhost;port=3306;username=root;password=";
    using (MySqlConnection conn = new MySqlConnection(connection))
    {
        conn.Open();
        foreach (DataRow importRow in imported_data.Rows)
        {
            string query = @"INSERT IGNORE INTO try1.workers (ID_WORKER, FNAME, LNAME,
            WORKERS_GROUP, POSITION) VALUES (@ID_WORKER, @FNAME, @LNAME,
            @WORKERS_GROUP, @POSITION);";

            MySqlCommand cmd = new MySqlCommand(query, conn);

            cmd.Parameters.AddWithValue("@ID_WORKER", importRow["ID_WORKER"]);
            cmd.Parameters.AddWithValue("@FNAME", importRow["FNAME"]);
            cmd.Parameters.AddWithValue("@LNAME", importRow["LNAME"]);
            cmd.Parameters.AddWithValue("@WORKERS_GROUP", importRow["WORKERS_GROUP"]);
            cmd.Parameters.AddWithValue("@POSITION", importRow["POSITION"]);

            cmd.ExecuteNonQuery();
        }
        conn.Close();
    }  
    MessageBox.Show("Imported to database");
}

Я вижу в базе данных mysql в столбце "LNAME" не все польские символы: "Aa Cc Ee Ll Nn Óó Ss Zz Zz". И этого недостаточно.

Что я пробовал?

Я пытался импортировать CSV-файл с другими форматами кодирования:

1) Encoding.Default - тогда в этом примере это выглядит примерно так: «Aa Cc Ee Ll Nn Óó Ss Zz Zz».

2) Encoding.ASCII - тогда он показывает все '?' символы

3) Encoding.UTF8 - но он показывает все «?» символы тоже.

4) Encoding.GetEncoding (1252) - не сильно помогло.

Что касается базы данных mysql, я установил utf8_polish_ci метод сравнения субтитров.

Теперь, как я могу импортировать CSV с польскими символами. Может быть, необходимо изменить строку кода в первом фрагменте кода импорта файла CSV:

using(StreamReader sr = new StreamReader(excel, Encoding.Default)) 

Есть идеи?

EDIT

Я использую phpmyadmin 4.8.4 , а версия базы данных mysql 10.1.37-MariaDB

Ответы [ 2 ]

1 голос
/ 11 июля 2019

У вас есть (как минимум) четыре вещи для проверки:

  • Правильно ли загружается Encoding.Default символы?Используйте отладчик Visual Studio и проверьте значения переменных line и fields.
    • Возможные исправления: сохраните файл как UTF-8 и используйте Encoding.UTF8.
  • Может ли ваша база данных хранить эти символы?Используйте MySQL Workbench для выполнения INSERT INTO try1.workers(LNAME) VALUES('ĄąĆćĘꣳŃńÓ󌜏źŻż'); SELECT * FROM try1.workers; (при необходимости добавьте другие столбцы).
    • Возможные исправления: Объявите тип столбца как utf8mb4_unicode520_ci.
  • Отправляет ли cmd.ExecuteNonQuery Unicode в базу данных?Используйте MySQL Workbench для выбора значений из таблицы после их вставки и проверки их правильности.
    • Возможные исправления: Добавьте CharSet=utf8mb4 в строку подключения или переключитесь на MySqlConnector , который всегда отправляет данные Unicode по сети.
  • Isphpmyadmin портит ваши данные при получении?Если все остальное выглядит правильно, то это может быть проблемой.
    • Возможные исправления: Задайте еще один вопрос SO (или отредактируйте этот), чтобы сосредоточиться исключительно на этой проблеме, а не на C # + MySQL.
0 голосов
/ 11 июля 2019

Сделать столбец yur NVARCHAR в таблице try1.workers для приема символов Unicode вместо ASCII.

...