首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >忽略结束列时,将忽略widechar中的大容量插入ROWTERMINATOR \n

忽略结束列时,将忽略widechar中的大容量插入ROWTERMINATOR \n
EN

Stack Overflow用户
提问于 2016-08-12 15:47:17
回答 1查看 226关注 0票数 0

我有一个格式正确的CSV -它是unicode制表符分隔的CSV,用CRLF分隔,十六进制的00 0D 00 0A -见下面的Notepad++图片:

当我在SQL Server 2008 (10.0.2531.0)上从SSMS 2016运行SQL命令时:

代码语言:javascript
复制
    BULK
     INSERT #ZCSD84
     FROM 'x:\ZCSD84.csv'
     WITH
     (
     FIELDTERMINATOR = '\t',
     ROWTERMINATOR = '\n',
     FIRSTROW = 1,
     CODEPAGE = 1250,
     DATAFILETYPE='widechar'
     )

我得到了很好的结果,除了在CSV记录的末尾有省略的制表符的行。在那里,我得到两行错误地合并成一行,如下所示。甚至来自下一行的第一个列值也被加到该行的最后一个列值上,从而产生例如Jednorázový zákazník CB30的值。

我曾尝试指定其他各种行终止符,如0x0A,但使用这些行终止符时总是出现The bulk load failed. The column is too long ...错误。

如何在CRLF被加密后立即强制创建新的表行?或者其他一些解决方法,比如正确地准备更多的CSV?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-12 16:46:07

我发现this answer表明这个问题可能没有简单的解决方案。我决定在批量插入之前使用C#控制台应用程序和CsvHelper修复CSV,这非常简单:

代码语言:javascript
复制
class Program
{
    public class ZCSD84
    {
        public string PrOrg { get; set; }
        public string Odberatel { get; set; }
        public string Dodavatel { get; set; }
        public string Jmeno1 { get; set; }
        public string Jmeno2 { get; set; }
        public string Ulice { get; set; }
        public string PSC { get; set; }
        public string Misto { get; set; }
        public string MistniCast { get; set; }
        public string DIC { get; set; }
        public string ICO { get; set; }
        public string StareCislo { get; set; }
        public string HeadOffice { get; set; }
        public string HeadOfficeName { get; set; }
        public string Payer { get; set; }
        public string PayerName { get; set; }
    }

    public sealed class ZCSD84Map : CsvClassMap<ZCSD84>
    {
        public ZCSD84Map()
        {
            Map(m => m.PrOrg).Index(0);
            Map(m => m.Odberatel).Index(1);
            Map(m => m.Dodavatel).Index(2);
            Map(m => m.Jmeno1).Index(3);
            Map(m => m.Jmeno2).Index(4);
            Map(m => m.Ulice).Index(5);
            Map(m => m.PSC).Index(7);
            Map(m => m.Misto).Index(8);
            Map(m => m.MistniCast).Index(9);
            Map(m => m.DIC).Index(10);
            Map(m => m.ICO).Index(11);
            Map(m => m.StareCislo).Index(12);
            Map(m => m.HeadOffice).Index(13);
            Map(m => m.HeadOfficeName).Index(14);
            Map(m => m.Payer).Index(15);
            Map(m => m.PayerName).Index(17);
        }
    }

    static void Main(string[] args)
    {
        string file1 = @"C:\JOBS\ZCSD84.csv";
        string file1Out = @"C:\JOBS\ZCSD84_out.csv";

        if (!File.Exists(file1))
            throw new FileNotFoundException(String.Format("Soubor csv nelze otevřít {0}.", file1));

        List<ZCSD84> ZCSD84s;
        CsvConfiguration config = new CsvConfiguration();
        config.Delimiter = "\t";
        config.IgnoreBlankLines = true;
        config.HasHeaderRecord = true;
        config.DetectColumnCountChanges = false;
        config.IgnoreReadingExceptions = false;
        config.SkipEmptyRecords = true;
        config.WillThrowOnMissingField = false;
        Encoding ce = System.Text.Encoding.GetEncoding(1250);
        config.Encoding = ce;
        config.QuoteNoFields = true;

        config.RegisterClassMap<ZCSD84Map>();
        Console.WriteLine(file1);
        using (CsvReader csvIn = new CsvReader(new StreamReader(file1), config))
        {
            ZCSD84s  = csvIn.GetRecords<ZCSD84>().ToList();
        }
        Console.WriteLine(file1Out);
        using (CsvWriter csvOut = new CsvWriter(new StreamWriter(file1Out, false, ce), config))
        {
            csvOut.WriteRecords(ZCSD84s);
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38912639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档