Member 10696161 Ответов: 3

Импорт csv tom ysql database - как читать файл с польскими символами?


У меня есть 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". И этого недостаточно.

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

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

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

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


Любая идея

Что я уже пробовал:

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

1) кодирование.Default - тогда он показывает, как я показываю в этом примере: "Aa Cc Ee Ll Nn Óó Ss Zz Zz".

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

3) кодирование.UTF8 - но он также показывает все символы"?".

4) кодирование.GetEncoding(1252) - не слишком помогло.

3 Ответов

Рейтинг:
2

phil.o

Первое, что нужно сделать, это выяснить, какая кодировка используется для csv-файла в первую очередь. Это может быть UTF-16 или UTF-32, или это может быть любая из кодировок, поддерживаемых на платформе, которая создала csv-файл. Также может быть проблема с порядком байтов файла. Поэтому вернитесь к источнику csv-файла, выясните, какая кодировка/порядок байтов используется; только тогда вы сможете правильно прочитать и отобразить его содержимое.


Member 10696161

Что касается csv-файла, то я сохраняю этот файл в форме MS Excel (Office 365) через запятую. Поэтому возможно, что он может быть закодирован в ANSI.

phil.o

Может быть эта тема[^] поможет вам пролить свет на ваши проблемы. Здесь[^]- это еще один пост, в котором обсуждаются конкретные проблемы с обработкой Office и .csv.

Рейтинг:
17

Member 10696161

Я не знаю, но я нашел это решение: в мою строку подключения не была добавлена "кодировка".
Если я посмотрю на "cmd.ExecuteNonQuery" не отправляет Unicode в базу данных MySQL.

Поэтому я добавил к этому коду строку и она выглядит так:

string connection = "datasource=localhost;port=3306;username=root;password=;CharSet=utf8mb4;";


Это означает: "CharSet=utf8mb4;" добавляется

Когда я проверил это, то это сработало. Но в любом случае большое вам спасибо за то, что вы дали мне эти решения! :)


Рейтинг:
1

Maciej Los

Предполагая, что вы правильно установили Наборы символов и параметры сортировки[^]...

Решение № 1 - Использование Конструктор StreamReader (System.IO) | Microsoft Docs[^] с utf-8 кодирование

using(StreamReader sr = new StreamReader(excel, System.Text.Encoding.GetEncoding("utf-8")))
{
	    string headerline = sr.ReadLine();
        if (string.IsNullOrEmpty(headerline))
        {
            Console.WriteLine("Not found or loaded not correct file.");
        }

        string[] headers = headerline.Split(new char[]{';'}, StringSplitOptions.RemoveEmptyEntries);
        imported_data.Columns.AddRange(headers.Select(h=>new DataColumn(h)).ToArray());

        while (!sr.EndOfStream)
        {
            string line = sr.ReadLine();
			imported_data.Rows.Add(line.Split(new char[]{';'}, StringSplitOptions.RemoveEmptyEntries));
		}
}


Решение № 2 - Использование Файл.Метод ReadAllLines (System.IO) | Microsoft Docs[^] с Linq

string[] lines= File.ReadAllLines(excel);
string[] headers = lines[0].Split(new char[]{';'}, StringSplitOptions.RemoveEmptyEntries); 
imported_data.Columns.AddRange(headers.Select(h=>new DataColumn(h)).ToArray());
imported_data = lines.Skip(1)
	.Select(line=> imported_data.LoadDataRow(line.Split(new char[]{';'}, StringSplitOptions.RemoveEmptyEntries), false))
	.CopyToDataTable();


Оба возвращают правильные данные.


Member 10696161

Я только что протестировал оба альтернативных решения, и они пока не работают, потому что вместо польских символов я получаю одни и те же знаки"?". Может быть, мне стоит изменить метод сравнения субтитров?

Maciej Los

- Куда же? В таблице данных или в базе данных?
Примечание: Я проверил и то, и другое, и они тоже работают. Мои региональные настройки такие же, как и ваши, так что он должен работать нормально и для вас тоже, если только ваш набор символов базы данных и параметры сортировки не были установлены неправильно.