如何读取以二进制形式传输的文本文件
我的代码将文件从 ftp(使用文本传输模式)复制到本地磁盘,然后尝试处理它们。 所有文件仅包含文本,值使用换行符分隔。有时,文件会使用二进制传输模式移动到此 ftp,看起来这会弄乱行尾。 使用十六进制编辑器,我根据用于将文件发送到 ftp 的传输模式来比较行尾: 使用文本模式:文件结尾为 0D 0A 使用二进制模式:文件结尾为 0D 0D 0A
是否可以修改我的代码,以便它可以在这两种情况下读取文件? 来自工作的代码说明了我的问题并显示了我如何读取文件: (这里我使用相同的文件,包含14行数据)
int i;
container con;
container files = ["c:\\temp\\axa_keio\\ascii.txt", "c:\\temp\\axa_keio\\binary.txt"];
boolean purchLineFirstRow;
IO inFile;
;
for(i=1; i<=conlen(files); i++)
{
inFile = new AsciiIO(conpeek(files,i), "R");
inFile.inFieldDelimiter('\n');
con = inFile.read();
info(int2str(conlen(con)));
}
文件从Unix系统到Windows系统。 不确定,但问题可能是:“我应该使用哪个 inFieldDelimiter 值来读取 Unix 和 Windows 行尾?”
My code copies files from ftp (using text transfer mode) to local disk and then trys to process them.
All files contain only text and values are seperated using new line. Sometimes files are moved to this ftp using binary transfer mode and looks like this will mess up line-ends.
Using hex editor, I compared line ends depending the transfer mode used to send files to ftp:
using text mode: file endings are 0D 0A
using binary mode: file endings are 0D 0D 0A
Is it possible to modify my code so it could read files in both cases?
Code from job that illustrates my problem and shows how i'm reading file:
(here i use same file, that contains 14 rows of data)
int i;
container con;
container files = ["c:\\temp\\axa_keio\\ascii.txt", "c:\\temp\\axa_keio\\binary.txt"];
boolean purchLineFirstRow;
IO inFile;
;
for(i=1; i<=conlen(files); i++)
{
inFile = new AsciiIO(conpeek(files,i), "R");
inFile.inFieldDelimiter('\n');
con = inFile.read();
info(int2str(conlen(con)));
}
Files come from Unix system to Windows sytem.
Not sure but maybe the question could be: "Which inFieldDelimiter values should i use to read both Unix and Windows line ends?"
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
使用
inRecordDelimiter
:而不是:
最后一个字段上可能仍然有一个悬空的 CR,您可能希望删除它:
另请参阅:http://en.wikipedia.org/wiki/Line_endings
Use
inRecordDelimiter
:instead of:
There may still be a dangling CR on the last field, you may wish remove this:
See also: http://en.wikipedia.org/wiki/Line_endings