sql 服务器中插入了错误的数据
Wrong data is inserted in sql server
我想知道在 sql 服务器中导入 CSV 文件的正确方法是什么
GLMAC1,GLMAC2,GLMAC3,GLYR,GLMON,GLSUB,GLTREF,GLDATE,GLDESC,GLAMT,GLSRC,GLBTCH,GLMCMP
1 ,32 ,110 ,13 ,1 ,0 ,171406200A ,120801 ,MH YM PANT W/DRAWS ,-.15 ,NOIA,ITCGR119,1
1 ,32 ,110 ,13 ,1 ,13402747 ,446286 ,120801 ,URBAN 1714062 ,15.13 ,904 ,ITCGR11B,1
1 ,32 ,110 ,13 ,1 ,0 ,172830300A ,120801 ,OP 5+2 SOCKS ,-.39 ,NOIA,ITCGR165,1
1 ,32 ,110 ,13 ,1 ,13402802 ,338728 ,120801 ,INDUSTRIES 1728303 ,39.28 ,904 ,ITCGR16C,1
1 ,32 ,110 ,13 ,1 ,0 ,171450700A ,120801 ,FA M.3PK FASHION S ,-.08 ,NOIA,ITCGR19Z,1
1 ,32 ,110 ,13 ,1 ,13402845 ,121811 ,120801 ,BO & CO... 1714507 ,7.49 ,904 ,ITCGR1B0,1
像这样大约有 5000 万行,我想将这些数据导入 SQL 服务器,但我注意到在导入数据后一些列被转移到另一列,这可能是因为第 9 列可能有一些逗号 (,) 值,SQL 服务器将其选为 (,) 分隔符。
有没有一种方法可以在 sql 服务器中无错误地插入数据,或者可能在插入之前清理 CSV 文件。该文件的大小约为 8 GB,我必须使用 010Editor 在编辑器或任何可用的软件中打开该文件,这些软件可以帮助我找出第 9 列中的哪些值包含 (,),以便我可以手动删除逗号.
此 C# 代码将读取文件,将在第 9 个字段周围添加一对 "s 来分隔它,并将其写入新的输出文件。例如:
像这样的一行
1 ,32 ,110 ,13 ,1 ,0 ,171406200A ,120801 ,MH YM,PANT W/DRAWS ,-.15 ,NOIA,ITCGR119,1
将写入输出文件为:
1 ,32 ,110 ,13 ,1 ,0 ,171406200A ,120801 ,"MH YM,PANT W/DRAWS ",-.15 ,NOIA,ITCGR119,1
正确分隔文本列后,它将适合导入到 SQL 服务器。
代码如下:
using System.Text.RegularExpressions;
void Main() {
Regex regex = new Regex("(.*?,.*?,.*?,.*?,.*?,.*?,.*?,.*?,)(.*)(,.*?,.*?,.*?,)", RegexOptions.CultureInvariant | RegexOptions.Compiled);
string regexReplace = "\"\"";
// The file to read - change this to your location
var iStream = new FileStream(@"R:\FILE.CSV", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
// The file to write
var oStream = new FileStream(@"R:\FIXEDFILE.CSV", FileMode.Create, FileAccess.Write, FileShare.Read);
int lineNo=0;
var sw = new System.IO.StreamWriter(oStream);
var sr = new System.IO.StreamReader(iStream);
while(!sr.EndOfStream) {
lineNo++;
string line=sr.ReadLine();
if (!regex.IsMatch(line)) {
// Bad lines don't get written to the output file
Console.WriteLine("Line {0} is bad - does not match the expected format:\n\r {1}", lineNo, line);
} else {
// Write the line with the ""'s around the 9th field
sw.WriteLine(regex.Replace(line,regexReplace));
}
if (lineNo%10000==0) Console.WriteLine("{0} lines processed", lineNo);
}
sr.Close();
sw.Close();
Console.WriteLine("Finished. Written {0} lines", lineNo);
}
我想知道在 sql 服务器中导入 CSV 文件的正确方法是什么
GLMAC1,GLMAC2,GLMAC3,GLYR,GLMON,GLSUB,GLTREF,GLDATE,GLDESC,GLAMT,GLSRC,GLBTCH,GLMCMP
1 ,32 ,110 ,13 ,1 ,0 ,171406200A ,120801 ,MH YM PANT W/DRAWS ,-.15 ,NOIA,ITCGR119,1
1 ,32 ,110 ,13 ,1 ,13402747 ,446286 ,120801 ,URBAN 1714062 ,15.13 ,904 ,ITCGR11B,1
1 ,32 ,110 ,13 ,1 ,0 ,172830300A ,120801 ,OP 5+2 SOCKS ,-.39 ,NOIA,ITCGR165,1
1 ,32 ,110 ,13 ,1 ,13402802 ,338728 ,120801 ,INDUSTRIES 1728303 ,39.28 ,904 ,ITCGR16C,1
1 ,32 ,110 ,13 ,1 ,0 ,171450700A ,120801 ,FA M.3PK FASHION S ,-.08 ,NOIA,ITCGR19Z,1
1 ,32 ,110 ,13 ,1 ,13402845 ,121811 ,120801 ,BO & CO... 1714507 ,7.49 ,904 ,ITCGR1B0,1
像这样大约有 5000 万行,我想将这些数据导入 SQL 服务器,但我注意到在导入数据后一些列被转移到另一列,这可能是因为第 9 列可能有一些逗号 (,) 值,SQL 服务器将其选为 (,) 分隔符。
有没有一种方法可以在 sql 服务器中无错误地插入数据,或者可能在插入之前清理 CSV 文件。该文件的大小约为 8 GB,我必须使用 010Editor 在编辑器或任何可用的软件中打开该文件,这些软件可以帮助我找出第 9 列中的哪些值包含 (,),以便我可以手动删除逗号.
此 C# 代码将读取文件,将在第 9 个字段周围添加一对 "s 来分隔它,并将其写入新的输出文件。例如:
像这样的一行
1 ,32 ,110 ,13 ,1 ,0 ,171406200A ,120801 ,MH YM,PANT W/DRAWS ,-.15 ,NOIA,ITCGR119,1
将写入输出文件为:
1 ,32 ,110 ,13 ,1 ,0 ,171406200A ,120801 ,"MH YM,PANT W/DRAWS ",-.15 ,NOIA,ITCGR119,1
正确分隔文本列后,它将适合导入到 SQL 服务器。
代码如下:
using System.Text.RegularExpressions;
void Main() {
Regex regex = new Regex("(.*?,.*?,.*?,.*?,.*?,.*?,.*?,.*?,)(.*)(,.*?,.*?,.*?,)", RegexOptions.CultureInvariant | RegexOptions.Compiled);
string regexReplace = "\"\"";
// The file to read - change this to your location
var iStream = new FileStream(@"R:\FILE.CSV", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
// The file to write
var oStream = new FileStream(@"R:\FIXEDFILE.CSV", FileMode.Create, FileAccess.Write, FileShare.Read);
int lineNo=0;
var sw = new System.IO.StreamWriter(oStream);
var sr = new System.IO.StreamReader(iStream);
while(!sr.EndOfStream) {
lineNo++;
string line=sr.ReadLine();
if (!regex.IsMatch(line)) {
// Bad lines don't get written to the output file
Console.WriteLine("Line {0} is bad - does not match the expected format:\n\r {1}", lineNo, line);
} else {
// Write the line with the ""'s around the 9th field
sw.WriteLine(regex.Replace(line,regexReplace));
}
if (lineNo%10000==0) Console.WriteLine("{0} lines processed", lineNo);
}
sr.Close();
sw.Close();
Console.WriteLine("Finished. Written {0} lines", lineNo);
}