我有一个试图导入SQL Server的管道划界文件。不幸的是,列数据没有文本合格,我无法获得发送给我的文件的新副本。

问题描述 投票:0回答:0
我尝试按行读取文件,计算该行中的列定界符的数量(我知道会有15个),如果该数字少于15,则在替换上进行替换以删除

CONTACT_SOURCE_ID|LAST_UPDATED|LAST_UPDATED_BY|T92|D10|T94|T95|T96|T97|T98|T99|T100|T101|T124|T125|T126 72|05/01/2006 14:48:38|13|||Mr|S|BLOGGS|1 Random Building Random Street|Random Town||Random County|RN1 2DM||| 74|05/01/2006 15:48:38|31|||Dr|Delta|Who|The Tardis|SpaceAndTime||Universe|D1 0WW|||

\n

\r

Environment.NewLine

,然后将行写回新文件。

const Int32 BufferSize = 128; string fileName = @"C:\Work\OriginalFile.txt"; string outputFile = @"C:\Work\NewFile.txt"; int numColBreaks = 0; using (var fileStream = File.OpenRead(fileName)) using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize)) { String line; while ((line = streamReader.ReadLine()) != null) { numColBreaks = 0; foreach (char c in line) { if (c == '|') { numColBreaks++; } } if (numColBreaks != 15) { line.Replace(Environment.NewLine, " ").Replace("\n", " ").Replace("\r", " "); } using (StreamWriter sw = File.AppendText(outputFile)) { sw.WriteLine(line); } } }

但这尚未起作用。
我还是C#的新事物,所以可能在这里忽略了一些东西。
如果我可以以某种方式文本限定数据,我认为SQL Server会这样工作:

BULK INSERT

但我不知道该怎么做,特别是考虑到此文本文件中有超过600,000行数据。
    
(这基本上不是答案,因为您不喜欢它,但我需要更多的空间)
Imho,在文本字段中拥有CRLF是很正常的,我不会为此而怪罪,但归咎于SQL Server女士与CRLF的比赛不佳。如今,我正在写各种各样的东西,可以从MS SQL迁移到PostgreSQL。这不仅包括移动表和数据,还包括SP,功能等。为了使长话简短,我不会尝试使用的是SQL女士的文字。

对于批量副本,如果有机会,则直接将Oracle用作源,而MS SQL用作C#中的SQLBulkCopy类作为目标。效果很好。
如果您需要使用文本导入,(这可能不是连续的任务),那么恕我直言,可以执行文本导入的最佳数据库就是PostgreSQL。只需安装PostgreSQL或将其与Docker一起使用(本地插入更容易),然后使用PostgreSQL的出色复制命令进行导入即可。它可以处理这样的数据。
一旦您在PostgreSQL中获得数据(与PostgreSQL进行最好的数据),您可以通过在PostgreSQL中使用FDW转移到MS SQL Server,或者对您来说更容易转移到SQLBULKCOPY类中,仅使用sqlbulkcopy类作为postgresql作为source,并且是MS SQL作为TARGET。
SpeedWise,假设您的数据看起来像您提供的数据,则将这些数据传达给PostgreSQL,然后再向MS SQL少于15-20秒。 或者,如果您不是C#的新手,则可以使用Regex对该数据进行消毒,并使用SQLBulkCopy类推到MS SQL(但仍然更容易完成此数据)。

c# sql-server text line-breaks delimited
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.