使用c#

时间:2016-05-11 09:37:55

标签: c# mysql csv

我使用c#来解析目录中的所有.csv文件,并将每个文件插入到单独的MYSQL表中。解析每个文件名都有效,但我在插入时遇到问题。

所有csv文件都具有相同的格式:

Name,Mike,John,Parker,Joanne,Claire
4/26/2012 12:20,88.1,98.2,87.4,92.5,78.2
5/16/2012 11:20,78.1,78.2,76.4,86.5,97.2
....
....  

Grade12表:

Id  StudentName  Score  DateTimeId

日期时间表:

Id  DateTime

当我导入csv文件并插入到grade12表中时,我希望结果如下:

Id  StudentName  Score  DateTimeId
1      Mike       88.1      1
2      John       98.2      1
3      Parker     87.4      1
4      Joanne     92.5      1
5      Claire     78.2      1
6      Mike       78.1      2
7      John       78.2      2
8      Parker     76.4      2
9      Joanne     86.5      2
10     Claire     97.2      2
....
....

和日期时间表:

Id    DateTime
1     2012-04-26 12:20:00
2     2012-05-16 11:20:00
....
....
到目前为止,我已经尝试

  1. 阅读csv的第一行(删除第一个元素" Name")并插入StudentName列。
  2. 阅读第二行csv(删除第一个元素" DateTime数据ex:4/26/2012")并插入Score列。
  3. 我应该使用每行的DateTime数据并插入到datetime Table和grade12表的外键中,但说实话,我很丢失。
  4. 我的c#代码:

    public void process(string csvFile, string grade)
        {
            using (MySqlCommand insertCommand = connection.CreateCommand())
            {
                insertCommand.CommandText =
                    @"INSERT INTO " + grade + "(StudentName, Score, DateTimeId) VALUES (@StudentName, @Score, @DateTimeId)";
    
                insertCommand.Parameters.Add(new MySqlParameter("@StudentName", "STRING"));
                insertCommand.Parameters.Add(new MySqlParameter("@Score", "DECIMAL"));
                insertCommand.Parameters.Add(new MySqlParameter("@DateTimeId", "INT32"));
    
                string[] lines = System.IO.File.ReadAllLines(csvFile);
    
                foreach (string line in lines)
                {
                    string trimedLine = line.Trim();
    
                    if (line.StartsWith("Name"))
                    {
                        studentNames = trimedLine.Split(new[] { ',' }).Skip(1).ToArray();
                        continue;
                    }                    
                        eachRow = trimedLine.Split(new[] { ',' }).Skip(1).ToArray();
    
                    for (int i = 0; i < studentNames.Length; i++)
                    {
                        MySqlParameter param = insertCommand.Parameters[0];
                        param.Value = studentNames[i];
                    }
    
                    for (int i = 0; i < eachRow.Length; i++)
                    {
                        MySqlParameter param = insertCommand.Parameters[1];
                        param.Value = eachRow[i];
                    }
    
                    //I am not sure about this part. This is random data for testing purpose. 
                    int[] datetime = { 1, 2, 3, 4, 5, 6, 7, 8 };
                    for (int i = 0; i < datetime.Length; i++)
                    {
                        MySqlParameter param = insertCommand.Parameters[2];
                        param.Value = datetime[i];
                    }
                    insertCommand.ExecuteNonQuery();
                }                
            }
    

    花了很多次,但还是四处闲逛。数据进入了表格,但它们并不好看。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

我担心我没有时间写出任何具体的代码示例,但我个人的做法是将程序分为两部分。

第一部分将解析CSV文件并将其内容放入类和这些类的列表中,以便以可迭代的格式获取数据。这允许您在后续步骤中使用可靠的数据模型,而不必在分析数据时实时构建SQL查询。这也有助于确保CSV格式正确。

第二部分在此之后运行,并使用之前创建的对象来创建和执行SQL查询。由于您已经以更灵活的格式解析了CSV中的数据,因此这应该更加简单。