0

我正在导入一个格式类似于报告的 Excel 文件 - 也就是说,对于它所属的每组行,某些列仅填充一次,例如:

    CaseID  |Date     |Code
     157207 |         |
            |8/1/2012 |64479
            |8/1/2012 |Q9967
            |8/1/2012 |99203

我需要捕获其中一个组标题(在上面的示例中为 CaseID)并将其用于字段为空白的后续行,然后保存我遇到的下一个值。我添加了一个变量 (User::CurrentCaseId) 和一个脚本转换,代码如下:

public class ScriptMain : UserComponent
{
    string newCaseId;

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        if (!Row.CaseIDName_IsNull && Row.CaseIDName.Length > 0)
            newCaseId = Row.CaseIDName;
        else
            newCaseId = "DetailRow";
    }

    public override void PostExecute()
    {
        base.PostExecute();
            if (newClaimNumber != "DetailRow")
                Variables.CurrentCaseId = newCaseId;
    }

基本上,我正在尝试读取存在的值并将其保存在此变量中。我使用条件拆分来丢弃只有 CaseID 的行,然后使用派生列将变量值放入新列以完成详细信息行。唉,该值始终为空白(在派生列之后放置一个数据查看器)。我修改了脚本以始终将变量设置为固定字符串 - 派生列仍然是空白的。

这似乎是一个不错的计划……我在 MS 论坛中收到了一些反馈,您不能在同一个数据流任务中设置变量值并使用它的新值。如果是这样,我能想到的唯一解决方案是在存在时将 CaseID 写入表中,并在不存在时将其读回。我真的很讨厌用几百万行(多个 Excel 工作表)来做这件事。有更好的想法吗?

最好的,斯科特

4

1 回答 1

0

这对您来说是一个很好的起点。

  1. 我使用以下文件作为源。将其保存到 C:\Temp\5.TXT
CaseID  |Date     |Code
157207  |         |
      |8/1/2012 |64479
      |8/1/2012 |Q9967
      |8/1/2012 |99203
157208  |         |
      |9/1/2012 |77779
      |9/2/2012 |R9967
      |9/3/2012 |11203
  1. 在控制流表面上放置一个 DFT。
  2. 将脚本组件作为源放在 DFT 上

    3.1。转到输入和输出部分

    3.2. 添加输出。将其名称更改为 MyOutput。

     3.2.1 Add the following output columns - CaseID, Date, Code
     3.2.1 The data types are four-byte unsigned integer [DT_UI4], string [DT_STR], string [DT_STR]
    
  3. 现在转到脚本//编辑脚本。把下面的代码。确保添加

使用 System.IO;

到命名空间区域。

    public override void CreateNewOutputRows()
{

    string[] lines = File.ReadAllLines(@"C:\temp\5.txt");

    int iRowCount = 0;
    string[] fields = null;
    int iCaseID = 0;
    string sDate = string.Empty;
    string sCode = string.Empty;

    foreach (string line in lines)
    {
        if (iRowCount == 0)
        {
            iRowCount++;
        }
        else
        {
            fields = line.Split('|');
            //trim the field values
            for (int i = 0; i < fields.Length; i++)
            {
                fields[i] = fields[i].Trim();
            }

            if (!fields[0].Equals(string.Empty))
            {
                iCaseID = Convert.ToInt32(fields[0]);
            }
            else
            {
                MyOutputBuffer.AddRow();

                MyOutputBuffer.CaseID = iCaseID;
                MyOutputBuffer.Date = fields[1];
                MyOutputBuffer.Code = fields[2];
            }
        }
    }
}

}

  1. 测试你的代码:在你放置 Script 组件的地方添加一个 Union All 组件。将 Script 组件的输出连接到 Union All 组件。放置数据查看器。

希望这对您有所帮助。请告诉我们。我今天回答了一个类似的问题;请也检查一下。这可能有助于巩固这个概念 - 恕我直言。

于 2013-04-17T03:18:38.410 回答