列の順序が異なる複数のテーブルを連結するチーム、
それぞれ 200 列を持つ 5 つの CSV ファイルがあります (各ファイルの列数は同じではありません)。 各ファイルには異なる順序の列があります。 ユーザーが 5 つのファイルすべてを選択し、5 つのファイルすべてを結合し (一致しない列を削除)、結合された csv ファイルを必要な場所に保存できるスクリプトを作成したいと考えています。 (data = Open(Pick File("Choose the File", x)), x はディレクトリ) のようなコマンドを使用して、ファイルを選択したいと考えています。
ありがとう
Re: 列の順序が異なる複数のテーブルを連結するありがとう@txnelson
いつも大変お世話になっております。Re: 列の順序が異なる複数のテーブルを連結する以下はスクリプトを再加工したもので、1 つの選択で連結するすべてのファイルを選択し、その後、小さなスクリプトを実行してそれらをまとめ、一致する列のみを保持します。 あなたの仕様に合わせて構築しましたが、任意の数のファイルを連結できるように簡単に変更できます。
Names Default To Here( 1 );
inputDirectory = "C:\";
// Select the files to be read in......this can be any number of files
filePath = Pick File(
"Choose the File to be Concatenated to:",
inputDirectory,
{"CSV Files|csv;", "All Files|*"},
1,
0,
""
);
// Open the first file
dtMain = Open( filePath, invisible );
files = Pick File(
"Choose the Additional 4 Files to Read In:",
inputDirectory,
{"CSV Files|csv;", "All Files|*"},
1,
0,
"",
multiple
);
// Validate that files have been read in
If( Try( N Items( files ), 0 ) == 4,
Dialog( "Incorrect number of files were read in."
"Only 4 additional files can be read in");
Throw( "Incorrect number of files were read in" );
);
// Read in the remaining files and process them
For( i = 2, i <= N Items( Files ), i++,
Try( dtConCat = Open( Files[i], invisible ) );
mainColList = dtMain << Get Column Names( string );
conCatColList = dtConCat << Get Column Names( string );
// Delete the columns in the dtConCat table that do not exist in the dtMain table
delList = {};
For( k = 1, k <= N Items( conCatColList ), k++,
If( N Rows( Loc( mainColList, conCatColList[k] ) ) == 0,
Insert Into( delList, conCatColList[k] )
)
);
If( N Items( delList ) > 0,
dtConCat << delete columns( delList )
);
// Delete the columns in the dtMain table that were not found in the dtConCat table
delList = {};
For( k = 1, k <= N Items( mainColList ),
k++,
If( N Rows( Loc( conCatColList, mainColList[k] ) ) == 0,
Insert Into( delList, mainColList[k] )
)
);
If( N Items( delList ) > 0,
dtMain << delete columns( delList )
);
// If any columns still remain in the two tables, then concatenate them together
If( N Cols( dtMain ) > 0 & N Cols( dtConCat ) > 0,
dtMain = dtMain << Concatenate( dtConCat, Append to First Table )
);
// Close the no longer needed file
Close( dtConCat, nosave );
);
// Make the main file visible
dtMain << show window( 1 );
Re: 列の順序が異なる複数のテーブルを連結する@ラジャット、
なぜ新しいテーブルを作成する必要があるのか理解できません。 私ならこんなことをします。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
OriginalColOrder = dt << Get Column Names("string");
dt << Reorder By Name();
SortedColOrder = dt << Get Column Names("string");
Show(OriginalColOrder);
Show(SortedColOrder); リストには、ソートされた順序と元の順序の両方が表示されます。 また、これまでに試したことを共有してください。そうすれば、どこに向かっているのかが理解しやすくなります。 あなたがこれまでに何を試みたのか、どこで失敗しているのかを正確に理解することができません。 データを共有できない場合は、誰もが簡単に問題を再現してガイドできるように、サンプル データを作成してみてください。
Re: 列の順序が異なる複数のテーブルを連結する@uday_guntupalli
元の順序を保存し、保存された順序で最終テーブルの順序を変更する構文を作成するのを手伝ってもらえますか?
ありがとうRe: 列の順序が異なる複数のテーブルを連結する@ラジャット、
dt << Reorder By Name();
Re: 列の順序が異なる複数のテーブルを連結するありがとう@uday_guntupalli
列を並べ替えて同じ順序にできるかどうか。 その後、すべてのテーブルを連結します。
最初のテーブルに基づいてすべてのテーブルの列を並べ替える構文を書くのを手伝ってください。その後、ループ内で concatenate コマンドを使用します。 それが不可能な場合は、最初のテーブルの元の列順序を保存し、すべてのテーブルをその名前で並べ替えて、ループで連結できます。 最後に、以前に保存した列の順序に基づいて、最終的なテーブルの順序を変更します。
@Craige_Hales @txnelsonこの問題に対する解決策はありますか。
ありがとう。 助けてくれてありがとう。Re: 列の順序が異なる複数のテーブルを連結する@ラジャット、
ThisListAsAA = Associative Array(ThisList);
ThisListAsAAKeys =ThisListAsAA << Get Keys;
If(i == 1,
CommonItems = ThisListAsAAKeys;
,
// else
CommonItems << Intersect(ThisListAsAAKeys);
);
連想配列には 1 対 1 の関係またはマッピングがあります。 したがって、連想配列を構築したら、2 行目で連想配列マップ内の一意のキーを抽出しようとします。 If ブロックに関しては、集合論を考えてください。i = 1 の場合、連想配列 1 の一意のキーを結果に割り当てます。 そこから、他の連想配列との相互作用を繰り返して、最終的にすべての連想配列に共通する要素のみを含むリストに到達します。
Select( :name, :age, :sex, :height, :weight ),
By Row Number
これは私の例のタイプミスでした。 Select(CommonItems) が適切です。
Concatenate が機能するかどうかはわかりませんが、ぜひお試しください。
Re: 列の順序が異なる複数のテーブルを連結する@uday_guntupalli
大変お世話になりありがとうございました。
コメントが少ない
- すべてのテーブルの行数は異なります。
- テーブルを結合せずにテーブルを連結(最終的なテーブルの行数は各テーブルの行数の合計になります)したいのですが。 連結ループも同じように機能しますか?
また、以下のコマンドを理解できるようにしてください。
- 共通の列名を検索するためのループ。 次の行について説明していただけますか。
ThisListAsAA <SPAN class="token operator">=</SPAN> <SPAN class="token function">Associative Array</SPAN><SPAN class="token punctuation">(</SPAN>ThisList<SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN>
ThisListAsAAKeys <SPAN class="token operator">=</SPAN>ThisListAsAA <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> Get Keys</SPAN><SPAN class="token punctuation">;</SPAN>
<SPAN class="token function">If</SPAN><SPAN class="token punctuation">(</SPAN>i <SPAN class="token operator">==</SPAN> <SPAN class="token number">1</SPAN><SPAN class="token punctuation">,</SPAN>
CommonItems <SPAN class="token operator">=</SPAN> ThisListAsAAKeys<SPAN class="token punctuation">;</SPAN>
<SPAN class="token punctuation">,</SPAN>
<SPAN class="token comment">// else </SPAN>
CommonItems <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> Intersect</SPAN><SPAN class="token punctuation">(</SPAN>ThisListAsAAKeys<SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN>
<SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN>
』でわかった範囲でThisListAsAA 「、」このリスト"は連想配列として保存されます。 次の 2 行を理解するのを手伝ってください。 - テーブルを結合するループで、次の行について説明していただけますか。
Select<SPAN class="token punctuation">(</SPAN> <SPAN class="token punctuation">:</SPAN>name<SPAN class="token punctuation">,</SPAN> <SPAN class="token punctuation">:</SPAN>age<SPAN class="token punctuation">,</SPAN> <SPAN class="token punctuation">:</SPAN>sex<SPAN class="token punctuation">,</SPAN> <SPAN class="token punctuation">:</SPAN>height<SPAN class="token punctuation">,</SPAN> <SPAN class="token punctuation">:</SPAN>weight <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN>
By Row Number
列名 :name、:age などの列はなく、列の数が膨大であるため、手動で列を選択するように書くことはできません。 また、行数が異なるため行番号で結合することはできず、結合ではなくテーブルを連結したいと考えています。
ありがとう
Re: 列の順序が異なる複数のテーブルを連結する@ラジャット、
私は同じ行数があると仮定しています(それがどれほど有効であるかはわかりません)。
// Define Your Directory and a list to hold File Paths
MyDirectory = "C:\" ;
nFiles = 5;
MyFilePaths = {};
ColNamesListOfList = {};
OpenDts = {};
// Test if Directory exists and get all file paths
Try( If(Directory Exists(MyDirectory),
for(i = 1 , i <= nFiles, i ++,
FilePath = Pick File( "Select File", MyDirectory);
Insert Into(MyFilePaths,FilePath);
);
,
// else
Throw()
),
"Unable to Open File";
);
// Get List of All Column Names
for(i = 1, i <= nFiles, i++,
OpenDts[i] = Open(MyDirectory || "\" || FilePath[i],"Invisible");
ColNames = OpenDts[i] << Get Column Names("String");
Insert Into(ColNamesListOfList,ColNames);
);
// Find Common Column Names
for(i = 1, i <= nFiles, i++,
ThisList = ColNamesListOfList[i];
ThisListAsAA = Associative Array(ThisList);
ThisListAsAAKeys =ThisListAsAA << Get Keys;
If(i == 1,
CommonItems = ThisListAsAAKeys;
,
// else
CommonItems << Intersect(ThisListAsAAKeys);
);
);
// Concatenate
for(i = 1, i <= nFiles, i++,
If(i == 1,
dt_Results = OpenDts[i];
,
dt_Results << Join(With( OpenDts[i]),
Merge Same Name Columns,
Select( :name, :age, :sex, :height, :weight ),
By Row Number // assuming that the tables have the same number of rows
);
);
); Re: 列の順序が異なる複数のテーブルを連結するありがとうウダイ。 共通の列を連結したい。Re: 列の順序が異なる複数のテーブルを連結する@ラジャット、
あなたが説明した問題を見て、それを複数のステップに分けてみましょう。
ステップ 1: 目的のファイルを選択する - Pick File () を使用する
),
"Unable to Open File";
); // Define Your Directory and a list to hold File Paths
MyDirectory = "C:\" ;
nFiles = 5;
MyFilePaths = {};
OpenDts = {};
// Test if Directory exists and get all file paths
Try( If(Directory Exists(MyDirectory),
for(i = 1 , i <= nFiles, i ++,
FilePath = Pick File( "Select File", MyDirectory);
Insert Into(MyFilePaths,FilePath);
); <BR /> , <BR /> // else<BR /> Throw()<BR />
ステップ 2: ファイルをループし、共通列を開いて連結する
ここで、あなたに質問があります。 最終的なテーブルに期待する列のリストはありますか (または) 5 つの CSV ファイルすべてに共通の列だけですか?