我正试图找到一种方法来计算来自平面文件的列。事实上,我所有的列都连接在一个签名单元格中,用'|'分隔,
经过多次尝试,似乎只有脚本任务才能处理此问题。有人能帮我吗?遗憾的是,我在C#或VB.中没有使用脚本的经验
非常感谢Emmanuel
为了更好地理解,下面是我想要实现的输出。例如,一个包含来自FF的所有标题的单元格。问题是,为了得到这个结果,我在上一步(派生列)中手动将所有列名彼此附加,以便用"|"分隔符将它们连接起来。现在,如果我的FF源布局发生变化,它将不再工作,因为这个手动过程。因此,我认为我必须使用一个脚本,它基本上返回变量中的列数(标题),并允许删除派生列transfo中的硬编码部分,例如
这是一个非常古老的线程;然而,我只是偶然发现了一个类似的问题。一个平面文件,里面有许多不同的记录"格式"。许多不同的格式,没有任何特定的顺序,这意味着你可能在一行中有57个字段,然后在接下来的1000行中有59个,然后在后面的10000行中有56个,再回到57个……好吧,我想你已经明白了。
由于没有更好的想法,我决定根据每行中的逗号数量来破坏该文件,然后使用SSIS包为每种类型导入不同的记录类型(现在是捆绑在一起的)。
因此,这个问题的答案就在那里,只需要多一点代码来生成文件。
希望这能帮助到有同样问题的人。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace OddFlatFile_Transformation
{
class RedistributeLines
{
/*
* This routine opens a text file and reads it line by line
* for each line the number of "," (commas) is counted
* and then the line is written into a another text file
* based on that number of commas found
* For example if there are 15 commas in a given line
* the line is written to the WhateverFileName_15.Ext
* WhaeverFileName and Ext are the same file name and
* extension from the original file that is being read
* The application tests WhateverFileName_NN.Ext for existance
* and creates the file in case it does not exist yet
* To Better control splited records a sequential identifier,
* based on the number of lines read, is added to the beginning
* of each line written independently of the file and record number
*/
static void Main(string[] args)
{
// get full qualified file name from console
String strFileToRead;
strFileToRead = Console.ReadLine();
// create reader & open file
StreamReader srTextFileReader = new StreamReader(strFileToRead);
string strLineRead = "";
string strFileToWrite = "";
string strLineIdentifier = "";
string strLineToWrite = "";
int intCountLines = 0;
int intCountCommas = 0;
int intDotPosition = 0;
const string strZeroPadding = "00000000";
// Processing begins
Console.WriteLine("Processing begins: " + DateTime.Now);
/* Main Loop */
while (strLineRead != null)
{
// read a line of text count commas and create Linde Identifier
strLineRead = srTextFileReader.ReadLine();
if (strLineRead != null)
{
intCountLines += 1;
strLineIdentifier = strZeroPadding.Substring(0, strZeroPadding.Length - intCountLines.ToString().Length) + intCountLines;
intCountCommas = 0;
foreach (char chrEachPosition in strLineRead)
{
if (chrEachPosition == ',') intCountCommas++;
}
// Based on the number of commas determined above
// the name of the file to be writen to is established
intDotPosition = strFileToRead.IndexOf(".");
strFileToWrite = strFileToRead.Substring (0,intDotPosition) + "_";
if ( intCountCommas < 10)
{
strFileToWrite += "0" + intCountCommas;
}
else
{
strFileToWrite += intCountCommas;
}
strFileToWrite += strFileToRead.Substring(intDotPosition, (strFileToRead.Length - intDotPosition));
// Using the file name established above the line captured
// during the text read phase is written to that file
StreamWriter swTextFileWriter = new StreamWriter(strFileToWrite, true);
strLineToWrite = "[" + strLineIdentifier + "] " + strLineRead;
swTextFileWriter.WriteLine (strLineToWrite);
swTextFileWriter.Close();
Console.WriteLine(strLineIdentifier);
}
}
// close the stream
srTextFileReader.Close();
Console.WriteLine(DateTime.Now);
Console.ReadLine();
}
}
}
请参阅我在以下Stack Overflow
问题中的回答。这些答案可能会让您了解如何加载包含不同列数的平面文件。
-
以下问题中的示例读取一个文件,该文件包含用特殊字符
Ç (c-cedilla)
分隔的数据。在您的情况下,分隔符为Vertical Bar (|)
UTF-8平面文件导入到SQL Server 2008无法识别{LF}行分隔符 -
以下问题中的示例读取一个EDI文件,该文件包含不同列数的不同部分。包读取文件,并相应地将其与父子关系加载到SQL表中。如何将具有标头和详细父子关系的平面文件加载到SQL server
根据这些答案中使用的逻辑,您还可以通过用列分隔符(Vertical Bar |)
分割文件中的行来计算列数。
希望能有所帮助。