如何使用X ++读取混有换行符和回车符的文本文件?

| 我正在尝试使用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);
…
我尝试了上述代码的各种组合,包括指定一个空白的“ 1”字段定界符,但具有相同的行为。 以下代码有效,但似乎应该有更好的方法来执行此操作:
// 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
这里的根本问题是我混合了输入格式。有些文件仅带有换行符“ 5”,而其他文件则带有“ 6”。使用上面的解决方法似乎对两者都有效。有没有办法处理这两种情况,或者从文件中剥离“ 7”?     
已邀请:
Con2Str: Con2Str将从容器中检索值列表,默认情况下使用ѭ8分隔值。
client server public static str Con2Str(container c, [str sep])
如果未指定“ 10”参数的值,则将在返回的字符串的元素之间插入逗号。 可能的选择: 如果希望将空格作为默认的分隔符,则可以将空格作为第二个参数传递给方法“ 11”。 另一种选择是,您还可以遍历容器
fileRecord
来获取各个元素。 程式码片段1: 下面的代码片段将文件内容加载到文本缓冲区中,并用换行符(
\\n
)替换回车符(
\\r
)。条件“ 15”将有助于跳过空字符串,因为可能会出现连续的换行符。
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\\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);
    }
}
    
从未尝试将默认的RecordDelimiter用作FieldDelimiter,并且未明确设置另一个RecordDelimiter。通常,行(记录)用\\ n分隔,字段用逗号,制表符,分号或其他符号分隔。当TextIO假定使用正确的UTF格式时,您可能还会遇到一些奇怪的行为。您没有提供数据文件中某些行的示例,因此很难进行猜测。 在此处阅读有关TextIO的更多信息:http://msdn.microsoft.com/zh-cn/library/aa603840.aspx 编辑: 在文件内容的其他示例中,在我看来,该文件是固定宽度的文件,其中每一列都有其自己的固定宽度。如果是这种情况,我宁愿建议使用subStr。在此处了解有关substr的信息:http://msdn.microsoft.com/zh-cn/library/aa677836.aspx     
转换Con2Str后,使用StrAlpha限制空白值     

要回复问题请先登录注册