c# - 在文件夹中搜索csv文件并插入mysql数据库

标签 c# mysql parsing

我正在尝试根据此 post 解析 mysql 数据库中的目录/插入中的文件几乎它正在工作,除了每列的 csv 值被四舍五入并成为数据库中的 INT 值。我认为我需要将 DECIMAL 更改为其他内容,但我无法弄清楚。

(例如:1.11 变为 1,45.5 变为 46)

csv 文件:

test1,test2,test3,test4 
1.11,1.23,67.4,4.5
1.12,5.42,45.5,6.45

我的代码:

public void sqlTest()
    {
        string connectionString = "server=localhost;database=test;UserId=root;password=test;";
        using (MySqlConnection connection = new MySqlConnection(connectionString))
        {
            connection.Open();
            using (MySqlCommand cmd = connection.CreateCommand())
            {
                cmd.CommandText = @"DROP TABLE test IF EXISTS";
                cmd.CommandText = @"CREATE TABLE test ( 
                                        Id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
                                        test1 DECIMAL,
                                        test2 DECIMAL,
                                        test3 DECIMAL,
                                        test4 DECIMAL
                                    )";
                cmd.ExecuteNonQuery();
            }
            connection.Close();
            connection.Open();

            using (MySqlCommand insertCommand = connection.CreateCommand())
            {
                insertCommand.CommandText =
                    @"INSERT INTO test (test1, test2, test3, test4)
                      VALUES (@test1, @test2, @test3, @test4)";

                insertCommand.Parameters.Add(new MySqlParameter("@test1", DbType.Decimal));
                insertCommand.Parameters.Add(new MySqlParameter("@test2", DbType.Decimal));
                insertCommand.Parameters.Add(new MySqlParameter("@test3", DbType.Decimal));
                insertCommand.Parameters.Add(new MySqlParameter("@test4", DbType.Decimal));

                string[] files = Directory.GetFiles("D:/computer/csv files", "*.csv");

                foreach (string file in files)
                {
                    string[] lines = System.IO.File.ReadAllLines(file);
                    bool parse = false;

                    foreach (string tmpLine in lines)
                    {
                        string line = tmpLine.Trim();
                        if (!parse && line.StartsWith("test1"))
                        {
                            parse = true;
                            continue;
                        }
                        if (!parse || string.IsNullOrEmpty(line))
                        {
                            continue;
                        }

                        foreach (MySqlParameter parameter in insertCommand.Parameters)
                        {
                            parameter.Value = null;
                        }

                        string[] values = line.Split(new[] { ',' });

                        for (int i = 0; i < values.Length; i++)
                        {
                            MySqlParameter param = insertCommand.Parameters[i];

                            decimal value;
                            param.Value = decimal.TryParse(values[i], out value) ? value : 0;

                        }
                        insertCommand.ExecuteNonQuery();
                    }

                }
            }
            connection.Close();
        }
    }        
}

感谢任何指导或提示!

最佳答案

如果我处于你的位置,我会首先将表结构更改为这样

 CREATE TABLE `test`(
   `test1` DOUBLE(13,2),
   `test2` DOUBLE(13,2),
   `test3` DOUBLE(13,2),
   `test4` DOUBLE(13,2) );

然后,您可以使用 LOAD DATA INFILE 命令将 csv 文件导入到 mysql 中的表中,而不是读取文件内容并为每条记录执行插入操作。

检查此链接 MySQL - LOAD DATA INFILE.以获得完整的文档。 示例用法如下

LOAD DATA INFILE 'test.csv' INTO TABLE test
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES

根据您的服务器环境,您需要正确编辑 csv 文件的路径,并确保您的 mysql 本地 infile 标志设置为 1 ,如果没有,您可以使用此命令进行设置

mysql -u username -p --local-infile=1

所以回到你的代码,它可以简化为这样

...
...
...

public void sqlTest()
{
    string connectionString = "server=localhost;database=test;UserId=root;password=test;";
    using (MySqlConnection connection = new MySqlConnection(connectionString))
    {
        connection.Open();
        string query = @"DROP TABLE test IF EXISTS;
                        CREATE TABLE `test`(
                       `test1` DOUBLE(13,2),
                       `test2` DOUBLE(13,2),
                       `test3` DOUBLE(13,2),
                       `test4` DOUBLE(13,2) );";
        using (MySqlCommand cmd = new MySqlCommand(query, connection))
        {               
            cmd.ExecuteNonQuery();
            string[] files = Directory.GetFiles("D:/computer/csv files", "*.csv");

            foreach (string file in files)
            {
               query =@"LOAD DATA INFILE '"+file+"' INTO TABLE test
                        FIELDS TERMINATED BY ','
                        LINES TERMINATED BY '\r\n'
                        IGNORE 1 LINES"; 
                using (MySqlCommand cmd1 = new MySqlCommand(query, connection))
                {   
                    cmd1.ExecuteNonQuery();
                }                   

            }
        }

    }
}
...
...
...

关于c# - 在文件夹中搜索csv文件并插入mysql数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37110873/

相关文章:

json - 如何跳过 JSON 对象流中的 'noise'?

C# 用时区解析日期时间

c# - WPF 自定义控件(多选组合框)的问题

c# - 我什么时候想用私有(private) ctor 模拟一个类(class)?

mysql - Laravel 6.0 迁移 - SQLSTATE[HY000] [2002] 没有这样的文件或目录

php - 获取MYSQL中的子级别

php - 使用案例和子查询 MySql 更新多个表

java - ANTLR 没有为 Scala 语法提供正确的输出标记

c# - BDD如何补充TDD

c# - 检查 POCO 上的属性值是否已更改