異なるフォルダーから複数の CSV ファイルをインポートし、値を更新し、別の名前で CSV を保存しますメインデータフォルダーと、\data\dataset1\dataset1.csv、\data\dataset2\dataset2.csv などの 95 個のサブフォルダーの下に、さまざまな列名を持つ約 95 個の csv ファイルが保存されています。id1 列と id2 列は共通の変数です。すべてのファイル。 次のことをしたいのです。
- 95 個の csv ファイルすべてを JMP にインポートします (JMP Pro 16 を使用)
- 95 個のファイルすべてにわたる条件に基づいて値を更新します: if (id1 = 'a001' then id2='b001')
- 更新したcsvファイルをそれぞれのフォルダに別名で保存する
最初の行はファイルのタイトルであり、削除できません。 列/変数名は行 2 から始まり、データは行 3 から始まります。
次の方法ですべてのファイルをインポートできました。
dt: 複数ファイルのインポート(
<<フォルダーの設定(
「C:\データ\」
)、
<<非表示の表示を設定( 0 )、
<<サブフォルダーを設定( 1 )、
<<名前フィルターを設定( "*.csv" ),
<<名前の設定を有効にする( 1 ),
<<サイズ フィルターの設定( {522, 2096152} )、
<<サイズを有効に設定( 0 )、
<<日付フィルターの設定( {3715322235, 3718948571} ),
<<日付の設定を有効にする( 0 )、
<<ファイル名列の追加を設定( 0 )、
<<ファイル サイズ列の追加を設定( 0 )、
<<ファイルの日付列の追加を設定( 0 )、
<<インポート モードの設定( "CSVData" ),
< <<スタック モードを設定( "ファイルごとのテーブル" )、
< < < < < < < < < < < < < < < < < < < < < < < <<インポート コールバックを設定( Empty() )
) << データをインポート;
このコードには、列名とデータがどこから始まるかを示す式はありません。
次に、次を使用して値を更新しようとしました。
dt: サブジッド <<
:id1 << 式を設定(
If( :id2 == "a001", :id1 == "b001")
);
その結果、id1 列の「a001」より前の値は削除され、「a001」の id1 値は更新されません。
私はこの段階で頭がいっぱいで、ファイルをそれぞれのフォルダーに別の名前で保存するという次の段階については思いつきません。 ご支援/ご指導をいただければ幸いです。
ありがとう
マスカスタマイゼーションウィンドウズRe: 複数の CSV ファイルを別のフォルダーからインポートし、値を更新し、別名で CSV を保存するありがとうございました。 これはすごいですね。
ヘラル
Re: 複数の CSV ファイルを別のフォルダーからインポートし、値を更新し、別名で CSV を保存するありがとうございます。一般的には便利だと思われるのですが、中にはやり方があまり明確ではないものもあるため、投稿しました。
MFI 更新 CSV
Re: 複数の CSV ファイルを別のフォルダーからインポートし、値を更新し、別名で CSV を保存するありがとうクレイジ。 おっしゃるとおり、2 番目の例はうまくいきました。 ただし、1 つの CSV を開いたりインポートした場合にのみ機能し、複数の CSV をインポートした場合は機能しませんでした。 また、CSV を異なるファイル名でそれぞれのフォルダーに書き戻す最後の段階も完了するように指導していただけますか?
ありがとう、
ヘラル
Re: 複数の CSV ファイルを別のフォルダーからインポートし、値を更新し、別名で CSV を保存するJSL が何をしたか分かりません:
dt: subjid << :id1 << Set Formula( If( :id2 == "a001", :id1 == "b001") )
<< "send" 演算子は 1 回だけ使用し、数式を追加する列は左側にある必要があります。 次に、if ステートメントには条件があり、その後に true の場合の値と false の場合の別の値が続きます。 このようなもの
dt << New Column( "likes",
"character",
formula( If(
Is Missing( name ), // first test
"unknown", // if first test is true
name == "KATIE", // second test
"cats", // if second test is true
"dogs" // if second test is false
)
)
);
これは、列名の値に応じて猫または犬の新しい数式列を作成することを目的としています。 名前が空白(欠落)の場合は、「不明」になります。
または、他の列の値に基づいて既存の列を上書きすることが目的の場合は、数式列よりも明示的なループの方が適している可能性があります。
foreachrow(dt,
if(
name == "DANNY", // a test with ==
name = "Dani"; // an assignment with =
sex = "F";
, /* else if */ name == "ROBERT",
name = "Roberta";
sex = "F";
);
);
(秘密の場合カンマとセミコロンを理解するのに役立つかもしれません。 ) これにより、名前が一致しない限り、行は変更されません。
2 つの例がどのように異なるかに注目してください。
最初の例では、式の列に割り当てられる答えを if(...) で生成する必要があります。 その行の列を変更しない必要がある場合、数式の値は行の元の値である必要があります。追記:ごめんなさい、それは違います。 数式列がすべての行に値を生成することを確認してください。
2 番目の例では、選択した行と列のみを更新します。
(JMP ファイルを保存するのではなく) CSV ファイルを書き出す予定なので、列に追加した数式は保存されません (ただし、数式から更新された値は保存されます)。 2番目の例。