1

我正在尝试使用 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从文件中剥离?

4

3 回答 3

3

Con2Str:

Con2Str将从容器中检索值列表,默认情况下用于comma (,)分隔值。

client server public static str Con2Str(container c, [str sep])

如果未sep指定参数值,则逗号字符将插入返回字符串中的元素之间。

可能的选项:

  1. 如果您希望空格作为默认分隔符,您可以将空格作为第二个参数传递给方法Con2Str

  2. 另一种选择是您还可以遍历容器fileRecord以获取各个元素。

代码片段1:

下面的代码片段将文件内容加载到文本缓冲区中,并将回车符 ( \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:

您可以使用 File 宏而不是对值进行硬编码\r\nR这表示读取模式。

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);
    }
}

Dynamics AX 作业输出

于 2011-05-24T20:09:20.293 回答
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

于 2011-05-24T13:23:11.990 回答
0

转换 Con2Str 后使用 StrAlpha 限制空白值

于 2016-04-12T07:21:51.713 回答