我正在尝试使用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.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
?
答案 0 :(得分:3)
Con2Str将从容器中检索值列表,默认情况下使用comma (,)
分隔值。
client server public static str Con2Str(container c, [str sep])
如果未指定 sep
参数的值,则会在返回的字符串中的元素之间插入逗号字符。
如果您希望空格成为默认分隔符,则可以将空格作为第二个参数传递给方法Con2Str
。
另一个选择是您还可以循环访问容器fileRecord
以获取各个元素。
下面的代码段将文件内容加载到 textbuffer 中,并用新行替换回车符( \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));
}
您可以使用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, 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);
}
}
答案 1 :(得分:1)
从未尝试使用默认的RecordDelimiter作为FieldDelimiter而不是显式设置另一个RecordDelimiter。通常行(记录)由\ n分隔,字段由逗号,制表符,分号或其他符号分隔。当TextIO采用正确的UTF格式时,您可能也会遇到一些奇怪的行为。你没有从数据文件中提供一些行的例子,所以猜测很难。
在此处详细了解TextIO:http://msdn.microsoft.com/en-us/library/aa603840.aspx
编辑: 使用文件内容的附加示例,在我看来,文件是固定宽度的文件,其中每列都有自己的固定宽度。如果是这种情况,我宁愿建议使用subStr。在这里阅读substr:http://msdn.microsoft.com/en-us/library/aa677836.aspx
答案 2 :(得分:0)
转换Con2Str
后,使用StrAlpha限制空值