我需要将两个具有不同列的csv文件导入到mysql数据库表中。
当我导入第二个文件时,仍然将第一个csv文件的数据与表放在一起,因此我需要一种方法或测试来更新数据(如果存在差异)并添加不存在的数据。
我的代码如下:
方法Import_Bilan用于第一个文件,Import_data用于第二个文件。
private void Import_Bilan_Click(object sender, EventArgs e)
{
DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog.
if (result == DialogResult.OK) // Test result.
{
string file = openFileDialog1.FileName;
string[] f = file.Split('\\');
// to get the only file name
string fn = f[(f.Length) - 1];
string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
string dest = path + @"\upload\" + fn;
//to copy the file to the destination folder
File.Copy(file, dest, true);
MessageBox.Show("File Uploaded !!");
//to copy the file to the destination folder
File.Copy(file, dest, true);
MySqlConnection con = new MySqlConnection("datasource=localhost;database=***;port=3306;username=root;password=root;SslMode=none;AllowUserVariables=true");
var msbl = new MySqlBulkLoader(con)
{
TableName = "**",
FieldTerminator = ";",
FileName = dest,
NumberOfLinesToSkip = 1,
};
msbl.Columns.AddRange(new[] { "***", "***""@discard", "@discard","@discard", "@discard", "@discard"});
msbl.Load();
con.Close();
MessageBox.Show("Data bind to database !!");
}
}
private void Import_Data_Click(object sender, EventArgs e)
{
DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog.
if (result == DialogResult.OK) // Test result.
{
string file = openFileDialog1.FileName;
string[] f = file.Split('\\');
// to get the only file name
string fn = f[(f.Length) - 1];
string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
string dest = path + @"\upload\" + fn;
//to copy the file to the destination folder
File.Copy(file, dest, true);
MessageBox.Show("File Uploaded !!");
//to copy the file to the destination folder
File.Copy(file, dest, true);
MySqlConnection con = new MySqlConnection("datasource=localhost;database=***;port=3306;username=root;password=root;SslMode=none;AllowUserVariables=true");
var msbl = new MySqlBulkLoader(con)
{
TableName = "****",
FieldTerminator = ";",
FileName = dest,
NumberOfLinesToSkip = 1,
};
msbl.Columns.AddRange(new[] { "@discard", "***" });
msbl.Load();
con.Close();
MessageBox.Show("Data bind to database !!");
}
}
答案 0 :(得分:0)
基于传递给msbl.Columns.AddRange
的列名,您的两个输入CSV文件似乎具有非常不同的数据类型和列数。 (如果不正确,请使用有关CSV文件结构的信息来编辑您的问题。)
如果这是真的,我将建议两种不同的方法之一:
使用类似CsvHelper的库来读取C#中的两个CSV文件并将数据连接在一起(例如,通过基于共享密钥创建Dictionary
),然后插入行(其中一个行位于一次)进入MySQL。这最终可能会变慢,并可能需要更多代码。所以,相反,您可以…
从上面的代码开始,但是将CSV文件加载到两个临时表中;我们称它们为exercices1
和exercices2
。 (它们可以具有与exercices
相同的架构,也可以根据需要为每个CSV创建自定义架构。)
然后执行一条MySQL INSERT INTO语句:
INSERT INTO exercices (all, the, output, columns, that, you, want)
SELECT e1.column1, e1.column2, e2.column1, e2.column2
FROM exercices e1 JOIN exercices e2
WHERE e1.some_column = e2.some_column;
显然,确切的详细信息取决于CSV文件的确切结构,它们包含的数据,它们具有哪些共同点(可以加入),等等。
完成此操作后,您可以删除将CSV数据加载到的两个表。