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. スペースをデフォルトの区切り文字にしたい場合は、2番目のパラメーターとしてスペースをメソッドに渡すことができますCon2Str

  2. fileRecordもう1つのオプションは、コンテナをループして個々の要素をフェッチすることもできます。

コードスニペット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:

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

DynamicsAXジョブの出力

于 2011-05-24T20:09:20.293 に答える
1

デフォルトの RecordDelimiter を FieldDelimiter として使用したり、別の RecordDelimiter を明示的に設定したりしないでください。通常、行 (レコード) は \n で区切られ、フィールドはコンマ、タブ、セミコロン、またはその他の記号で区切られます。TextIO が正しい UTF 形式を想定している場合、奇妙な動作が発生することもあります。データファイルの一部の行の例を提供していないため、推測は困難です。

TextIO の詳細については、http://msdn.microsoft.com/en-us/library/aa603840.aspx をご覧ください。

EDIT:ファイルコンテンツの追加の例では、ファイルは固定幅ファイルであり、各列には独自の固定幅があるようです。その場合は、むしろ subStr を使用することをお勧めします。ここでsubstrについて読んでください:http://msdn.microsoft.com/en-us/library/aa677836.aspx

于 2011-05-24T13:23:11.990 に答える