Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何加载以管道(|)分隔的文本文件,该文件的列有时包含换行符?_Vb.net_Ssis_Delimited Text - Fatal编程技术网

Vb.net 如何加载以管道(|)分隔的文本文件,该文件的列有时包含换行符?

Vb.net 如何加载以管道(|)分隔的文本文件,该文件的列有时包含换行符?,vb.net,ssis,delimited-text,Vb.net,Ssis,Delimited Text,我构建了一个SSIS包,它将几个分隔的文本文件加载到SQL数据库中。其中一个文件中通常包含行空格,这打破了设置平面文件源并映射到ado.net目标的标准数据流任务,因为它在到达换行符时认为它位于新行上。发送文件的供应商不希望在不进行任何编辑的情况下发送文件,此时无法使用XML。有办法解决这个问题吗?我正在考虑编写一个小的vb.net程序来更正文件,使它们在SSIS包中工作,但不确定如何编写该逻辑。该文件有5列,前2列是大整数,总是包含一些长整数ID,然后是一个小文本列,其中只包含一个短单词,然后

我构建了一个SSIS包,它将几个分隔的文本文件加载到SQL数据库中。其中一个文件中通常包含行空格,这打破了设置平面文件源并映射到ado.net目标的标准数据流任务,因为它在到达换行符时认为它位于新行上。发送文件的供应商不希望在不进行任何编辑的情况下发送文件,此时无法使用XML。有办法解决这个问题吗?我正在考虑编写一个小的vb.net程序来更正文件,使它们在SSIS包中工作,但不确定如何编写该逻辑。该文件有5列,前2列是大整数,总是包含一些长整数ID,然后是一个小文本列,其中只包含一个短单词,然后是一个日期,然后是导致问题的长注释字段。comments字段有时为空(这是正常的),问题是行有换行符。我从来不知道评论中有多少换行符,有些没有,有些可以有几个,甚至多个换行符,所以我想知道这是否可能

5787626 | 6547599 |批准| 2017年1月10日|申请人费用减免申请批准 5443221 | 7742812 |现行| 11/5/2013| 3430962 | 7643957 |重新安排| 2016年5月25日|修订条款和条件被拒绝 申请人有30天时间提交延期文件。 34433624 | 7673715 |拒绝| 2017年1月24日| 34113575 | 7653748 |有效| 1/8/2014 |新条款已授予

示例文件格式


只要有可以编程/预测的逻辑,就有可能实现

我会使用脚本组件作为源代码,这意味着您不需要在处理之前重写文件。它还提供了很大的灵活性,例如,您可以在文件中的多行上迭代时将值存储在变量中,等等

我最近发布了另一个答案,其中给出了很多关于如何解决这个问题的细节:

保存变量中的值直到行准备好写入的示例:-

对于这个例子,我写了三列,ID1、ID2和注释。该文件如下所示:

1|2|Comment1
Comment2
4|5|Comment3
Comment4
Comment5
6|7|Comment6
脚本组件包含以下方法

public override void CreateNewOutputRows()
{
    System.IO.StreamReader reader = null;

    try
    {
        bool readFirstLine = false;
        int id1 = 0;
        int id2 = 0;
        string comments = null;

        reader = new System.IO.StreamReader(Variables.FilePath); // this refers to a package variable that contains the file path

        while (!reader.EndOfStream)
        {
            string line = reader.ReadLine();

            if (line.Contains("|"))
            {
                if (readFirstLine)
                {
                    Output0Buffer.AddRow();

                    Output0Buffer.ID1 = id1;
                    Output0Buffer.ID2 = id2;
                    Output0Buffer.Comments = comments;
                }
                else
                {
                    readFirstLine = true;
                }

                string[] fields = line.Split('|');

                id1 = Convert.ToInt32(fields[0]);
                id2 = Convert.ToInt32(fields[1]);
                comments = fields[2];
            }
            else
            {
                comments += " " + line;
            }

            if (reader.EndOfStream)
            {
                Output0Buffer.AddRow();

                Output0Buffer.ID1 = id1;
                Output0Buffer.ID2 = id2;
                Output0Buffer.Comments = comments;
            }
        }
    }
    catch
    {
        if (reader != null)
        {
            reader.Close();
            reader.Dispose();
        }

        throw;
    }
}
结果集为:

ID1    ID2    Comments
===    ===    ========
1      2      Comment1 Comment2
4      5      Comment3 Comment4 Comment5
6      7      Comment6

我也做过类似的事情。以我的方法为指导。我创建了一个包含30列的临时表(我的管道分隔列固定为最多30列)。现在读取管道分隔列并将其写入txt文件。然后再次读取文本并将其放入暂存表中。写入后删除txt文件。希望这有意义吗?我不明白,如果我将文件加载到一个暂存表中,那么我将得到一个暂存表,其中列中的数据没有意义。例如,这会让我在一个只包含大整数值的列中留下“申请人有30天”这样的文本?我想我误解了您的输出要求。我希望能够将以平面文件分隔的文本加载到SQL表中。问题是平面文件中的最后一列没有结束分隔符,它使用CRLF(行间距)指示转到下一行,并且通常最后一列在数据中有行间距。我不能使用子字符串,因为字段中的数字/字符长度不是固定长度,甚至不能对(|)进行拆分因为最后一个注释字段通常为空,并且它在注释字段的下一行的第一行中读取。您可以在逻辑中做些什么,如果一行不包含管道,您只需将该字符串添加到上一行注释字段的末尾?您可以为每个字段使用变量,并且只有在您知道该字段已完成后才能创建一行,即,您读取包含管道的新行。是的,这听起来是个好主意,但不确定如何在返回并附加到前一行的位置执行此操作。我在回答中添加了一个示例,如果有任何不清楚的地方,请告诉我。没问题!请记住把答案标为正确。谢谢:)