我试图将文件从ECDIC转换为ASCII格式,遇到了一个有趣的问题。这些文件包含固定长度的记录,其中一些字段是带符号的二进制整数(在记录布局中描述为B4),以及长精度数值(在记录布局中描述为L8)。我已经能够毫无问题地转换字符数据,但我不确定如何转换这些数值。下面描述了原始系统的参考手册(IBM5110)中的字段。
private void ConvertFile(EbcdicFile file)
{
if (file == null) return;
var filePath = Path.Combine(file.Path, file.FileName);
if (!File.Exists(filePath))
{
this.Logger.Info(string.Format("Cannot convert file {0}. It does not exist.", filePath));
return;
}
var ebcdic = Encoding.GetEncoding(37);
string convertedFilepath = Path.Combine(file.Path, file.ConvertedFileName);
byte[] fileData = File.ReadAllBytes(filePath);
if (!file.HasNumericFields)
File.WriteAllBytes(convertedFilepath, Encoding.Convert(ebcdic, Encoding.ASCII, fileData));
else
{
var convertedFileData = new List<byte>();
for (int position = 0; position < fileData.Length; position += file.RecordLength)
{
var segment = new ArraySegment<byte>(fileData, position, file.RecordLength);
file.Fields.ForEach(field =>
{
var fieldSegment = segment.Array.Skip(segment.Offset + field.Start - 1).Take(field.Length);
if (field.Type.Equals("string", StringComparison.OrdinalIgnoreCase))
{
convertedFileData.AddRange(
Encoding.Convert(ebcdic, Encoding.ASCII, fieldSegment.ToArray())
);
}
else if (field.Type.Equals("B4", StringComparison.OrdinalIgnoreCase))
{
// Not sure how to convert this field
}
else if (field.Type.Equals("L8", StringComparison.OrdinalIgnoreCase))
{
// Not sure how to convert this field
}
});
}
File.WriteAllBytes(convertedFilepath, convertedFileData.ToArray());
}
}
您必须首先知道固定记录大小。使用filestream.read()读取一个记录值的字节。然后encoding.getString()将其转换为字符串。
然后使用string.substring()从记录中提取字段。B4是一个长度为4的子串调用,L8是长度为8的子串调用。进一步用decimal.parse()将这样的字段转换为数字。你可能要把结果除,不清楚用的是什么定点乘数。100的好赔率。
我尝试过使用python 2.6将EBCDIC转换为ASCII,但在这方面存在许多问题,比如压缩字段没有得到转换,记录计数增加。 是否有任何方法转换EBCDIC文件压缩字段到ASCII格式。
我应该使用Java将EBCDIC文件转换为ASCII。到目前为止,我有以下代码: 文件描述如下: 我们可以忽略每行的前2个字节。问题是,有用法的字节是COMP,因为阅读器没有正确地转换它们,我想我应该把这些读成字节或什么的,尽管我不知道怎么读。
我们有PHP服务器代码,在iSeries中端执行SQL语句。 以下是SQL查询的简化版本 查询执行得很好,问题是当使用诸如“sometext”“title”这样的静态字段/值时,结果在PHP中返回时,它们不是所需的格式 谢了! 编辑 根据bucks的建议,我们将用户配置文件CCSID更改为37,而不是65535 解决方案是将用户配置文件改为使用CCSID37,并将服务器作业改为使用CCSID37。
问题内容: 我应该通过使用Java将EBCDIC文件转换为ASCII。到目前为止,我有以下代码: 文件描述如下: 我们可以忽略每一行的前2个字节。问题是字节存在USAGE IS COMP,因为读者无法正确转换它们,我想我应该将它们读取为字节或其他内容,尽管我不知道如何。 问题答案: 如果我正确地解释了这种格式,则您的二进制文件格式具有固定长度的记录。其中一些记录不是字符数据(COBOL计算字段?)
我正在尝试使用Apache Beam中JRecord中的CobolIoProvider类将EBCDIC文件转换为ASCII。 我正在使用的代码: 代码根据需要读取和转换文件。我只能从本地系统读取cobolfilename和copybookname,它们基本上分别是EBCDIC文件和copybook的路径。但是,当我试图从GCS读取文件时,它失败了,FileNotFoundException--“文