我在C#上有点生疏,我试图想出一个在SSIS中使用的简单脚本,它将梳理文本文件并根据一组特定模式和所述模式的特定序列提取值。
我需要从此文本输入中指定各行的值,以作为输出传递给文本文件。因此,合约号,库号等是头,每行都是文件中的包装值。我只需要能够梳理和ID行输出,并认为正则表达式可以做到这一点,但我不确定如何把这样的东西放在一起。是否可以通过查找特定序列中的值模式来为每行ID?
即。
Pattern1 = [0-9] {9} for contract num
Pattern2 = [a-z][0-9] {6} for bank num
但是找一下Pattern1在Pattern2之前的实例?
我希望这是有道理的。
非常感谢任何和所有帮助。
感谢。
示例文字
答案 0 :(得分:1)
您正在使用的文件似乎是固定宽度;无论谁编写生成此文件的程序,他都会通过其位置传达每个字段的含义。因此,您的程序最好按照传递方式使用信息,方法是根据数据的位置解释数据,而不是匹配特定正则表达式的能力。话虽这么说,正则表达式将是解析之后验证数据的好方法。
要使用这种数据,我可能会构建一个表示单个记录的类,并为其提供解析和验证的方法。这是我很快想出来的东西:
public class DetailRecord
{
private readonly string _originalText;
static private Dictionary<string, Func<string,string>> _map = new Dictionary<string, Func<string,string>>
{
{ "ContractNo", s => s.Substring( 1 ,10 ) },
{ "BankNum", s => s.Substring( 15 , 8 ) },
{ "ShortName", s => s.Substring( 35 ,10 ).Trim() }
};
public DetailRecord(string originalText)
{
_originalText = originalText;
}
public string this[string key]
{
get
{
return _map[key](_originalText);
}
}
public string BankNum
{
get { return this["BankNum"]; }
}
public string ContractNo
{
get { return this["ContractNo"]; }
}
public string ShortName
{
get { return this["ShortName"]; }
}
public bool IsValid
{
get
{
int dummy;
if (!int.TryParse(this.ContractNo, out dummy)) return false;
if (!Regex.IsMatch(this.BankNum, @"[A-Z]\d\d\s\s\d\d\d")) return false;
return true;
}
}
}
你会注意到这个类保留了一个静态字典(_map
),其中包含用于解析每个字段的函数列表。
另请注意,有IsValid
属性使用正则表达式来验证银行编号。合同号码似乎是直接数字,它也验证了这一点。
测试程序:
public class Program
{
public static void Main()
{
var input = " 0759651386 X08 606 0209784104 BURTON 3334.24";
var line = new DetailRecord(input);
if (line.IsValid)
{
Console.WriteLine("Contract number: '{0}'", line.ContractNo);
Console.WriteLine("Bank number: '{0}'", line.BankNum);
Console.WriteLine("Short name: '{0}'", line.ShortName);
}
}
}
输出:
Contract number: '0759651386'
Bank number: 'X08 606'
Short name: 'BURTON'