Axapta 如何读取使用X+混合换行和回车的文本文件+;?

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); … 我尝试了

我正在尝试使用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

从未尝试将默认的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
    循环获取单个元素

  • 代码片段1: 下面的代码段将文件内容加载到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));
    }
    
    代码段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
    循环获取单个元素

  • 代码片段1: 下面的代码段将文件内容加载到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));
    }
    
    代码段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。请参阅最新编辑。