ファイルを開く (ファイル名から文字を検索)全て、
ユーザー入力に基づいてファイル名の文字を検索して、フォルダー内のファイルを開こうとしています。
/* Input values in 3 columns by user. eg of file name: ABC_12_XYZ. User will input ABC in 1st column, 12 in second col and XYZ in 3rd column. all three should match in a row for selecting the file. There could be 100's of files (unique name) in the folder. User will input all that he wants to select from folder into input file. The file name search is limited to 10 characters from beginning of file name. The code is getting stuck somewhere in loop*/
//Script ------
Retrieve = Open( "C:\*\inputfile.jmp" );
x = Column( Retrieve, "Col1" ) << Get Values;
y = Column( Retrieve, "Col2" ) << Get Values;
z = Column( Retrieve, "Col3" ) << Get Values;
// location of files which needs to be read from a folder based on user inputs.
Set Default Directory("C:\test\");
Close( Retrieve, NoSave );
Col1_search = 1;
Col2_search = 1;
Count = 0;
For( i = 1, i <= N Items( files ), i++,
For( j = 1, j <= N Items( z ), j++,
If( Contains( files[i], z[j] ),
If( Col1_search == 1,
If( (Contains( files[i], z[j] ) & Contains( Left( files[i], 10 ), x[j] )) > 0,
If( Col2_Search == 1,
If(
((Contains( files[i], z[j] ) & Contains( Left( files[i], 10 ), x[j] )) > 0) & (Contains( Left( files[i], 10 ), y[j] ) > (Contains( Left( files[i], 10 ), x[j] ))),
Open( files[i] );
Count++;
),
Open( files[i] );
If( Count == N Items( z ),
Break();
);
)
)
),
Open( files[i] )
)
);
);
openDTs = {};Re: ファイルを開く(ファイル名から文字を調べる)@ウダイ
私は問題を理解することができます。 ソースは 18 文字で、パターンは文字列全体です。
以下のように、すべてのファイルに対して入力ファイルの検索を実行するループを 1 つ追加しました。
素早い対応に感謝します。
ありがとう!
のために(私= 1 、私<= N 個のアイテム(ファイル) 、私++、
のために( j = 1 、 j <= N 個のアイテム(バツ) 、 j ++、
もし( !不足している(正規表現(サブ文字列(ファイル[私】 、 1 、 18 ) 、シャア(バツ[ j 】 || 「_」 || y [ j ] || 「_」 || z [ j ] ) ) ) 、
開ける(テストディレクトリ|| 「\」 ||ファイル[私】 ) ;
壊す() ;
) ;,
)
) ;
Re: ファイルを開く(ファイル名から文字を調べる)dt = Open( "$SAMPLE_DATA/Cities.jmp" ); // Open Sample Data
dt << Select Where(!IsMissing(Regex(Char(:city),"ALB")));
「Contains」関数を使用する必要はありません。 上に示した例を見てください。 ファイル名の 18 文字だけを検索したい場合は、Substr 関数を使用して抽出する必要があります。
dt = Open( "$SAMPLE_DATA/Cities.jmp" ); // Open Sample Data
dt << Select Where(!IsMissing(Regex(Char(:city),Substr("ALBANY",1,3))));
Re: ファイルを開く(ファイル名から文字を調べる)これがログのコピーです -
次のスクリプトでは、/*###*/ でマークされたエラーが発生します。
For( i = 1, i <= N Items( Files ), i++,
もし(
!不足している(
正規表現/*###*/(Char(
× || /*###*/"_" || /*###*/y || /*###*/"_" || /*###*/z/*###*/
)、ファイル[i])
)、
Open( TestDir || "\" || Files[i] )
)
)
私が contains を使用している理由は、長さが 40 文字になる可能性があるファイル名から 18 文字を探すためです。
自分が正しくやっているのかどうかわかりません。
Re: ファイルを開く(ファイル名から文字を調べる)@CG 、
エラーの内容を共有していただけますか? ログのコピー?
また、Contains を追加する理由がわかりません。
2 番目の引数は、照合対象の用語である必要があります。
したがって、自分の名前を検索しようとすると、次のようになります。
If (!IsMissing(Regex(Char(x || "_" || y || "_"||z),"CG")),
Re: ファイルを開く(ファイル名から文字を調べる)ファイル名の最初の18文字を探しています
以下のループを変更し、ファイル名 x_y_z1234 の z までの 18 文字を検索する条件を追加しました。
のために(私= 1 、私<= N 個のアイテム(ファイル) 、私++、
もし( !不足している(正規表現(シャア(バツ|| 「_」 || y || 「_」 || z ) 、含まれています(左(ファイル[私]) 、 18 )) 、
開ける(テストディレクトリ|| 「\」 ||ファイル[私]) ;
) 、
) ;
) ;
しかし、私はまだエラーが発生します -
For( i = 1, i <= N Items( Files ), i++,
/*###*/(が欠落している場合(
Regex( Char( x || "_" || y || "_" || z )、Contains( Left( Files[i] )、18 ) )、
Open( TestDir || "\" || Files[i] )
))
)
Re: ファイルを開く(ファイル名から文字を検索する)@CG 、
あなたの場合、ファイル形式は常に ABC_12_XYZ (つまり x_y_z) であると仮定するのは公平ですか? 「はい」の場合、別のより簡単な方法は次のとおりです。
Retrieve = Open( "C:\*\inputfile.jmp" );
x = Column( Retrieve, "Col1" ) << Get Values;
y = Column( Retrieve, "Col2" ) << Get Values;
z = Column( Retrieve, "Col3" ) << Get Values;
Close(Retrieve,"No Save");
TestDir = "C:\test\";
Files = Files In Directory(TestDir); // Returns a list of files in the directory
for(i = 1, i <= N Items(Files), i++,
If(!IsMissing(Regex(Char(x || "_" || y || "_"||z),Files[i])),
Open(TestDir ||"\" || Files[i]);
);
);