Axapta 如何读取使用X+混合换行和回车的文本文件+;?
我正在尝试使用Dynamics AX读取文本文件。但是,以下代码将行中的所有空格替换为逗号:Axapta 如何读取使用X+混合换行和回车的文本文件+;?,axapta,dynamics-ax-2009,ax,Axapta,Dynamics Ax 2009,Ax,我正在尝试使用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); … 我尝试了
// Open file for read access
myFile = new TextIo(fileName , 'R');
myFile.inFieldDelimiter('\n');
fileRecord = myFile.read();
while (fileRecord)
{
line = con2str(fileRecord);
info(line);
…
我尝试了上述代码的各种组合,包括指定一个空白的'
字段分隔符,但行为相同
下面的代码可以工作,但似乎应该有更好的方法来实现这一点:
// 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
这里的根本问题是我有混合输入格式。一些文件只有换行符
{LF}
,其他文件只有{CR}{LF}
。使用我上面的变通方法似乎对两者都有效。是否有办法处理这两个问题,或者从文件中删除\r
?从未尝试将默认的RecordDelimiter用作FieldDelimiter,也没有明确设置另一个RecordDelimiter。通常,行(记录)由\n分隔,字段由逗号、制表符、分号或其他符号分隔。当TextIO采用正确的UTF格式时,您可能还会遇到一些奇怪的行为。您没有提供数据文件中某些行的示例,因此很难猜测
请在此处阅读有关TextIO的更多信息:
编辑:
对于文件内容的附加示例,在我看来,该文件是一个固定宽度的文件,其中每列都有自己的固定宽度。如果是这样的话,我宁愿推荐使用subStr。阅读此处的substr:从未尝试将默认的RecordDelimiter用作FieldDelimiter,也没有显式设置另一个RecordDelimiter。通常,行(记录)由\n分隔,字段由逗号、制表符、分号或其他符号分隔。当TextIO采用正确的UTF格式时,您可能还会遇到一些奇怪的行为。您没有提供数据文件中某些行的示例,因此很难猜测 请在此处阅读有关TextIO的更多信息: 编辑: 对于文件内容的附加示例,在我看来,该文件是一个固定宽度的文件,其中每列都有自己的固定宽度。如果是这样的话,我宁愿推荐使用subStr。请在此处阅读substr:Con2Str: 将从容器中检索值列表,默认情况下使用
逗号(,)
分隔值
client server public static str Con2Str(container c, [str sep])
如果未指定sep
参数的值,则将在返回字符串的元素之间插入逗号字符
可能的选择:
Con2Str
fileRecord
循环获取单个元素\r
)替换为新行(\n
)字符。条件if(strlen(line)>1)
将有助于跳过空字符串,因为可能会出现连续的换行符
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, 1, newLinePos));
if (strlen(line) > 1)
{
field1 = substr(line, 1, 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:
您可以使用文件宏,而不是硬编码表示读取模式的值\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, 1, 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);
}
}
Con2Str:
将从容器中检索值列表,默认情况下使用逗号(,)
分隔值
client server public static str Con2Str(container c, [str sep])
如果未指定sep
参数的值,则将在返回字符串的元素之间插入逗号字符
可能的选择:
Con2Str
fileRecord
循环获取单个元素\r
)替换为新行(\n
)字符。条件if(strlen(line)>1)
将有助于跳过空字符串,因为可能会出现连续的换行符
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, 1, newLinePos));
if (strlen(line) > 1)
{
field1 = substr(line, 1, 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:
您可以使用文件宏,而不是硬编码表示读取模式的值\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, 1, 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);
}
}
转换Con2Str后使用StrAlpha限制空白值转换Con2Str后使用StrAlpha限制空白值对不起,你说得对-我没有提供文件的详细信息。请查看最新编辑。对不起,你是对的-我没有提供文件的详细信息。请参阅最新的编辑。这有助于我识别问题-我正在阅读的一些文本文件是\r\n,而一些只是\r\n。请参阅最新编辑。这有助于我识别问题-我正在阅读的一些文本文件是\r\n,而一些只是\r\n。请参阅最新编辑。