问题描述
|
我正在尝试使用Dynamics AX读取文本文件。但是,以下代码用逗号替换行中的所有空格:
// Open file for read access
myFile = new TextIo(fileName,\'R\');
myFile.inFieldDelimiter(\'\\n\');
fileRecord = myFile.read();
while (fileRecord)
{
line = con2str(fileRecord);
info(line);
…
我尝试了上述代码的各种组合,包括指定一个空白的“ 1”字段定界符,但具有相同的行为。
以下代码有效,但似乎应该有更好的方法来执行此操作:
// Open file for read access
myFile = new TextIo(fileName,\'R\');
myFile.inRecordDelimiter(\'\\n\');
myFile.inFieldDelimiter(\'_stringnotinfile_\');
fileRecord = myFile.read();
while (fileRecord)
{
line = con2str(fileRecord);
info(line);
文件的格式是字段格式。例如:
datafield1 datafield2 datafield3
datafield1 datafield3
datafield1 datafield2 datafield3
因此,除非我使用上面的解决方法,否则最终会得到以下结果:
line=datafield1,datafield2,datafield3
这里的根本问题是我混合了输入格式。有些文件仅带有换行符“ 5”,而其他文件则带有“ 6”。使用上面的解决方法似乎对两者都有效。有没有办法处理这两种情况,或者从文件中剥离“ 7”?
解决方法
Con2Str:
Con2Str将从容器中检索值列表,默认情况下使用ѭ8分隔值。
client server public static str Con2Str(container c,[str sep])
如果未指定“ 10”参数的值,则将在返回的字符串的元素之间插入逗号。
可能的选择:
如果希望将空格作为默认的分隔符,则可以将空格作为第二个参数传递给方法“ 11”。
另一种选择是,您还可以遍历容器fileRecord
来获取各个元素。
程式码片段1:
下面的代码片段将文件内容加载到文本缓冲区中,并用换行符(\\n
)替换回车符(\\r
)。条件“ 15”将有助于跳过空字符串,因为可能会出现连续的换行符。
TextBuffer textBuffer;
str textString;
str clearText;
int newLinePos;
str line;
str field1;
str field2;
str field3;
counter row;
;
textBuffer = new TextBuffer();
textBuffer.fromFile(@\"C:\\temp\\Input.txt\");
textString = textBuffer.getText();
clearText = strreplace(textString,\'\\r\',\'\\n\');
row = 0;
while (strlen(clearText) > 0 )
{
row++;
newLinePos = strfind(clearText,\'\\n\',1,strlen(clearText));
line = (newLinePos == 0 ? clearText : substr(clearText,newLinePos));
if (strlen(line) > 1)
{
field1 = substr(line,14);
field2 = substr(line,15,12);
field3 = substr(line,27,10);
info(\'Row \' + int2str(row) + \',Column 1: \' + field1);
info(\'Row \' + int2str(row) + \',Column 2: \' + field2);
info(\'Row \' + int2str(row) + \',Column 3: \' + field3);
}
clearText = (newLinePos == 0 ? \'\' : substr(clearText,newLinePos + 1,strlen(clearText) - newLinePos));
}
代码段2:
您可以使用File宏而不是对表示读取模式的值\\r\\n
和R
进行硬编码。
TextIo inputFile;
container fileRecord;
str line;
str field1;
str field2;
str field3;
counter row;
;
inputFile = new TextIo(@\"c:\\temp\\Input.txt\",\'R\');
inputFile.inFieldDelimiter(\"\\r\\n\");
row = 0;
while (inputFile.status() == IO_Status::Ok)
{
row++;
fileRecord = inputFile.read();
line = con2str(fileRecord);
if (line != \'\')
{
field1 = substr(line,Column 3: \' + field3);
}
}
,从未尝试将默认的RecordDelimiter用作FieldDelimiter,并且未明确设置另一个RecordDelimiter。通常,行(记录)用\\ n分隔,字段用逗号,制表符,分号或其他符号分隔。当TextIO假定使用正确的UTF格式时,您可能还会遇到一些奇怪的行为。您没有提供数据文件中某些行的示例,因此很难进行猜测。
在此处阅读有关TextIO的更多信息:http://msdn.microsoft.com/zh-cn/library/aa603840.aspx
编辑:
在文件内容的其他示例中,在我看来,该文件是固定宽度的文件,其中每一列都有其自己的固定宽度。如果是这种情况,我宁愿建议使用subStr。在此处了解有关substr的信息:http://msdn.microsoft.com/zh-cn/library/aa677836.aspx
,转换Con2Str后,使用StrAlpha限制空白值