2

我已经用 C# 编写了一个 AWS 状态机,以将来自 S3 Bucket 的 CSV 文件中的数据加载到 SQL Server 数据库表中,但是我在表中得到了非常奇怪的数据。

两个主要功能如下,第一个获取响应负载,第二个将其分解为可以插入的行。

private static async Task<ISelectObjectContentEventStream> GetSelectObjectContentEventStream(S3Object s3Object,
    AmazonS3Client s3Client, ObjectDefinition definition)
{
    var response = await s3Client.SelectObjectContentAsync(new SelectObjectContentRequest()
    {
        Bucket = s3Object.BucketName,
        Key = s3Object.Key,
        ExpressionType = ExpressionType.SQL,
        Expression = definition.Query,
        InputSerialization = new InputSerialization()
        {
            CSV = new CSVInput()
            {
                FileHeaderInfo = FileHeaderInfo.Use,
                FieldDelimiter = ",",
            }
        },
        OutputSerialization = new OutputSerialization()
        {
            CSV = new CSVOutput()
            {
                QuoteFields = QuoteFields.AsNeeded,
                FieldDelimiter = ",",
                RecordDelimiter = "\r\n"
            }
        }
    });

    return response.Payload;
}

下一部分只是一段代码,它获取有效负载并将其放入字符串列表中,以便每一行都可以插入到数据库中

foreach (var entity in listResponse.S3Objects.Where(n => n.Key.Contains(definition.FilePrefix)))
{
    definition.FileName = entity.Key;

    if (entity.Key.Contains(definition.FileExtension))
    {
        staticDataConsumer.TargetFoundCount++;

        context.Logger.LogLine($"entity {entity.Key}");
        List<string> lines = new List<string>();

        using (var s3Events = await GetSelectObjectContentEventStream(entity, s3Client, definition))
        {
            foreach (var ev in s3Events)
            {
                //context.Logger.LogLine($"Received {ev.GetType().Name}!");
                if (ev is RecordsEvent records)
                {
                    using (var reader = new StreamReader(records.PayloadEncoding.UTF8))
                    {
                        string line;

                        while ((line = reader.ReadLine()) != null)
                        {
                            if (line.Length > 0)
                            {
                                lines.Add(line);
                            }

                            context.Logger.LogLine($"{line}");
                        }
                    }
                }
            }
        }
    }
}

当我将数据提取记录到 CloudWatch 日志或类似文件时,数据看起来是正确的。这是 CSV 的原始格式(我尝试了不同的内容类型、text/csv、text/plain、UTF8 等,没有任何更改。我什至尝试了一个用逗号分隔的文本文件,同样的问题)。

Retail Store,Store Retail Business Manager
105,Kate Fardell
106,Shona Marino
108,Shona Marino
111,Sharon Berger
112,Lina Hannawe
113,Jennifer Hale
114,Paul Dalton
116,Claire Eggbeer
118,Paul Dalton
119,Shona Marino
127,Aydin Tebyanian
128,Cameron Palmer

这是登录到 CloudWatch 或其他任何地方时数据的样子。

'105','Kate Fardell'
INSERT INTO StaticDataConsumer_RBMReport_csv (RowInsertDateTime,ServerName,RetailStore,RetailBusinessManager) VALUES(GETDATE(),'SDC','105','Kate Fardell') 
'106','Shona Marino'
INSERT INTO StaticDataConsumer_RBMReport_csv (RowInsertDateTime,ServerName,RetailStore,RetailBusinessManager) VALUES(GETDATE(),'SDC','106','Shona Marino') 
'108','Shona Marino'
INSERT INTO StaticDataConsumer_RBMReport_csv (RowInsertDateTime,ServerName,RetailStore,RetailBusinessManager) VALUES(GETDATE(),'SDC','108','Shona Marino') 
'111','Sharon Berger'
INSERT INTO StaticDataConsumer_RBMReport_csv (RowInsertDateTime,ServerName,RetailStore,RetailBusinessManager) VALUES(GETDATE(),'SDC','111','Sharon Berger') 
'112','Lina Hannawe'
INSERT INTO StaticDataConsumer_RBMReport_csv (RowInsertDateTime,ServerName,RetailStore,RetailBusinessManager) VALUES(GETDATE(),'SDC','112','Lina Hannawe') 
'113','Jennifer Hale'

但是,当我检查结果表时,数据 - 每个字符 - 在它和下一个字符之间都有一个空格?

RowInsertDateTime       RetailStore     RetailBusinessManager
----------------------- --------------- ----------------------------------------------------------------------------------------------------
2018-11-01 11:54:38.667  1 0 5           K a t e   F a r d e l l 
2018-11-01 11:54:38.683  1 0 6           S h o n a   M a r i n o 
2018-11-01 11:54:38.687  1 0 8           S h o n a   M a r i n o 
2018-11-01 11:54:38.690  1 1 1           S h a r o n   B e r g e r 
2018-11-01 11:54:38.690  1 1 2           L i n a   H a n n a w e 
2018-11-01 11:54:38.693  1 1 3           J e n n i f e r   H a l e 
2018-11-01 11:54:38.697  1 1 4           P a u l   D a l t o n 
2018-11-01 11:54:38.700  1 1 6           C l a i r e   E g g b e e r 
2018-11-01 11:54:38.700  1 1 8           P a u l   D a l t o n 
2018-11-01 11:54:38.703  1 1 9           S h o n a   M a r i n o 
2018-11-01 11:54:38.707  1 2 7           A y d i n   T e b y a n i a n

我在这里失去理智。这可能是什么原因造成的?我以前从未见过它。有趣的是,如果我在 SQL Management Studio 的“结果到网格”中查看数据,其中包含间隔数据的列显示为空白?但是当我以文本查看结果时,我可以看到记录,但它们中有这些空格?我在这里失去理智。我试过了。

一旦 S3 对象位于存储桶中,就在 S3 对象上设置不同的内容类型元数据(列出了我在本文前面尝试过的内容类型)。

将对象写入 S3 时设置不同的内容类型(例如,使用 PowerShell s3 写入对象)。

尝试将文件保存为与 csv 具有相同“内容”的文本文件,而不是将其保存为实际的 csv。

没变。

有人可以帮忙吗?网上没有太多关于 AWS S3 SELECT :(

4

0 回答 0