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

时间:2011-05-24 11:22:17

标签: 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.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

3 个答案:

答案 0 :(得分:3)

Con2Str:

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

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

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

可能的选项:

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

  2. 另一个选择是您还可以循环访问容器fileRecord以获取各个元素。

  3. 代码段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:

    您可以使用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 job output

答案 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限制空值