c# - 读取 TXT 文件并将其转换为 SQL 脚本
问题描述
我有一个txt文件:
LoginId; No_Intervenant
EF2KBT0; 1003820030
ENHD0KE; 1003820129
E9PM7EP; 1003820153
EFT10OO; 1003820218
我需要创建另一个 txt 文件,其中包含来自此信息的 sql UPDATE 脚本,例如:
UPDATE Contact
Set
Contact.No_Intervenant = '1003820030'
where
ISNULL (Contact.LoginId, '') = 'ER7OZXZ';
我只使用一种Stringbuilder
方法得到了这个结果,但是执行了硬编码。我想要的是自动添加标题。
public Form1()
{
InitializeComponent();
}
private static void AddSqlCommand(StringBuilder sql, string[] columns, string[] types, string[] values)
{
sql.AppendLine("UPDATE Contact");
sql.AppendLine("SET");
//skip LoginId columns
for (int i = 1; i < columns.Length; i++)
{
switch (types[i].Trim())
{
case "int":
sql.Append($" Contact.{columns[i].Trim()} = {values[i]}");
//sql.Append($" Contact.{columns[0].TrimStart() } = {values[i]}");
break;
default:
sql.Append($" Contact.No_Intervenant = '{values[i]}'");
break;
}
if (columns.Length > 1 && i != columns.Length - 1)
{
sql.Append(",");
}
sql.AppendLine();
}
sql.AppendLine("WHERE");
sql.AppendLine($" ISNULL(Contact.LoginId, '') = '{values[0]}';");
sql.AppendLine();
}
private static StringBuilder GenerateSqlScript(string[] fileContent)
{
var sqlCommand = new StringBuilder();
string[] types = fileContent[0].Split(';');
string[] columns = fileContent[1].Split(';');
//skip the first line (header)
for (int i = 2; i < fileContent.Length; i++)
{
string[] values = fileContent[i].Split(';');
if (values.Length >= 1)
{
AddSqlCommand(sqlCommand, columns, types, values);
}
}
return sqlCommand;
}
我怎样才能自动获取和添加标题?因为我可能不得不对更长的文件执行此操作,对于其他文件有更多的列和更多的更新行,并且我不想硬编码文件的所有标题,就像我接下来必须做的示例一样:
标题:
No_Intervenant;First_Name;Last_Name;Role_SE;EMail;电话;分机;Statut;Address_1;Address_2;Zip;CPF;Inscription_Particulier;DHM_Stat_Part;Date_via_ClicSeQur;Last_Update;
数据:
1003820030;NOEL;SANTOS;Particulier;;;;Actif;1528 STREET;VAL-D''OR CA;AAA 5T9;123456789;Actif;;2016-07-19 09:49:43;2019-02-08 14: 24:19;
解决方案
我相信您只需要对字符串插值进行一些简单的更改,请参见下文。如果您有影响多个表的更新,则应将表名附加到数组中的列。
这是我测试的方式,根据您的逻辑,文件的第一行应包含您的数据类型(您发布的示例没有)。所以要么你的逻辑错了,要么数据样本错了。它适用于测试代码。
private void button4_Click(object sender, EventArgs e)
{
var line = new List<string>();
line.Add("string;string");
line.Add("LoginId; No_Intervenant");
line.Add("EF2KBT0; 1003820030");
line.Add("ENHD0KE; 1003820129");
line.Add("E9PM7EP; 1003820153");
line.Add("EFT10OO; 1003820218");
var fileContent = line.ToArray();
var sqlCommand = new StringBuilder();
string[] types = fileContent[0].Split(';');
string[] columns = fileContent[1].Split(';');
//skip the first line (header)
for (int i = 2; i < fileContent.Length; i++)
{
string[] values = fileContent[i].Split(';');
if (values.Length >= 1)
{
AddSqlCommand(sqlCommand, columns, types, values, "client");
}
}
}
编辑功能:
private static void AddSqlCommand(StringBuilder sql, string[] columns, string[] types, string[] values, string table)
{
sql.AppendLine($"UPDATE {table}");
sql.AppendLine("SET");
//skip LoginId columns
for (int i = 1; i < columns.Length; i++)
{
switch (types[i].Trim())
{
case "int":
sql.Append($" {columns[i].Trim()} = {values[i]}");
break;
default:
sql.Append($" {columns[i].Trim()} = '{values[i]}'");
break;
}
if (columns.Length > 1 && i != columns.Length - 1)
{
sql.Append(",");
}
sql.AppendLine();
}
sql.AppendLine("WHERE");
sql.AppendLine($" ISNULL({columns[0].Trim()}, '') = '{values[0]}';");
sql.AppendLine();
}
}
推荐阅读
- c++ - 为什么 [class.temporary]/2 中的注释 3?第 (2.1) 至 (2.6) 段不应该具有规范地位吗?
- flutter - 在颤振中,如何在异步函数执行完成后严格触发某些事情?
- python - 为什么不是所有标签都显示在 matplotlib 图例中?
- python - Selenium Automation 将文件保存到目录
- visual-studio-code - 为什么我在 VS Code 中出现终端错误?
- excel - 如何抑制更改事件以允许在 vlookup 期间使用全部值?
- python-3.x - 如何使用整数键制作 TypedDict?
- c# - 防止将特定异常记录到 App Insights
- python - TypeError: unhashable type: 'LineString' 当使用 ox.simplify_graph()
- python - 有没有办法限制客户端在 Python 聊天室应用程序中发送的消息数/秒?