The following C# code will parse an X937 file (Image Cash Letter) and get the amounts of each check
// BigEndianBitConverter class taken from http://www.yoda.arachsys.com/csharp/miscutil/
// ConvertEBCDICtoASCII method taken from http://kseesharp.blogspot.com/2007/12/convert-ebcdic-to-ascii.html
static void Main(string[] args)
{
var input = new BinaryReader(new FileStream("YourICLFile.icl",FileMode.Open));
byte[] amount_bytes, record_type_bytes;
byte[] record_lenght_bytes = input.ReadBytes(4);
var converter = new BigEndianBitConverter();
int record_lenght = converter.ToInt32(record_lenght_bytes,0);
string record_type, amount_str;
//Totals
long check_items= 0, total_amount = 0;
try
{
while (true)
{
//Get record type
record_type_bytes = input.ReadBytes(2);
record_type = ConvertEBCDICtoASCII(record_type_bytes);
if (record_type == "99") //file control (end of file)
break;
if (record_type == "25") //check detail
{
check_items++;
input.ReadBytes(45); //move the stream's position to the field containing the amount of the check
amount_bytes = input.ReadBytes(10);
amount_str = ConvertEBCDICtoASCII(amount_bytes);
Console.Out.WriteLine(check_items);
Console.Out.WriteLine("$ " + amount_str);
total_amount += long.Parse(amount_str);
input.ReadBytes(record_lenght - (2 + 45 + 10)); //move the stream's position to the next record
}
else
{
input.ReadBytes(record_lenght - 2); //move the stream's position to the next record
}
//Get next record's size
record_lenght_bytes = input.ReadBytes(4);
record_lenght = converter.ToInt32(record_lenght_bytes, 0);
}
}
catch (EndOfStreamException end)
{
}
finally
{
input.Close();
}
Console.Out.WriteLine("Number of items: " + check_items);
Console.Out.WriteLine("$ " + ((decimal)total_amount / (decimal)100));
Console.ReadLine();
}Please note that the code above is for demonstration purposes, you can optimize the reading of the file by using File.OpenRead.
Comments
Thanks again