txt ファイルを JMP にインポートしたいのですが、テキストが完全に整列していません。 そこで、空のセルを削除したいと思います。 さまざまな方法を試しましたが、JMP では列/行全体しか削除できないようです。 入力形式から出力形式に変換する方法はありますか? ありがとう。
入力:
| 名前 | 列1 | 列2 | コラム3 | コラム4 | コラム5 |
| エマ | | 38 | 33208 | 30630 | 31360 |
| メアリー | | 38 | 48263 | 44694 | 45753 |
| リサ | 38 | 45961 | 42755 | 43766 | 43887 |
| デビッド | 38 | 32799 | 30643 | 31365 | 31452 |
出力:
名前 | 列1 | 列2 | コラム3 | コラム4 | コラム5 |
エマ | 38 | 33208 | 30630 | 31360 | 30350 |
メアリー | 38 | 48263 | 44694 | 45753 | 47263 |
リサ | 38 | 45961 | 42755 | 43766 | 43887 |
デビッド | 38 | 32799 | 30643 | 31365 | 31452 |
ありがとう! うまくいきました! この部分は私が現在取り組んでいることにとって重要であり、これは本当に大きな助けです。
ファイルが極端に大きくなく、JMP のバージョンに文字関数 Collapse Whitespace() が含まれている場合。
ここでは、JSL を使用したより簡単な解決策を示します。
Names Default to Here(1);
infid = "c:\temp\ExtraTab_testIn.txt";
outfid = "c:\temp\_xxxdummy.txt";
fid = Load Text File(infid);
ww = words(fid, "\!N"); //each line is stored as text in a list
for(i=1, i<=nitems(ww), i++,
ww[i] = Collapse Whitespace(ww[i]); //replace tabs spaces, or any nonprinatble char even EOL with a single space
);
fid = Concat Items(ww, "\!N"); //combine into a single text and add the EOL char
Save Text File(outfid,fid); //save it
<BR />delete symbols(fid, ww);
//open it
dt = Open( outfid,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Space, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 0 ),
Column Names Start( 1 ),
Data Starts( 1 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
If( File Exists(outfid), Delete File(outfid) );
@エマブルー, Jim は、テキスト ファイルがインポートされた後に問題を解決する方法の解決策を提供しました。 2 つのオプションについて説明します。それぞれは元のファイルに応じて異なります。
#1 元のファイルに列区切り文字としてスペースが含まれている場合、修正は簡単です。 選択するとファイル > 開くオプションを使用するプレビュー付きデータスペースとスペースの両方が選択されていることを確認します

選択していた場合データ、テキストインポート設定を使用の場合、デフォルトはスペースです。 その場合は、UI による修正を使用してください。プレビュー付きデータ。 スクリプトを使用している場合は、以下のスクリプトの Open ステートメントを使用する必要があります。
#2元のファイルに列区切り文字としてタブが含まれている場合、修正はそれほど簡単ではありません。 UI を介して、テキスト エディターを使用したり、タブをスペースで検索したり置換したりできます。余分なタブがある場合に備えてタブを指定する方法が見つかりませんでした。 コメント:タブオプションはウィッシュ リストの項目として適している可能性があり、ユーザーが 0x090x09 や HexToChar("0909") などの複数の文字を指定できるようにすることもできます。他のまたはオプションを追加してください繰り返される区切り文字を無視する。 ファイルを編集できない場合、またはテキスト エディターを使用して各タブをスペースに置き換えたくない場合、および Windows PC を使用している場合は、ファイル パスを変更することで以下の JSL ファイルを変更できます。 [名前] 列にスペースが含まれている場合、これは機能せず、正規表現を使用した別のスクリプトを使用して、重複したタブを単一のタブに置き換えることができます。
データをコピーしてテーブルに貼り付ける場合は、Jim のソリューションを使用する必要があります。
入力ファイルに関する詳細があれば、より有用なスクリプト/ソリューションを提供できます。
Names Default to Here(1);
findchar = "\!t"; //tab
infid = "C:\temp\ExtraTab_testIn.txt"; //file path
outfid = "c:\temp\_xxxdummy.txt";
//This was DOS script was found at StackOverflow 1/16/2019
//https://stackoverflow.com/questions/23075953/batch-script-to-find-and-replace-a-string-in-text-file-without-creating-an-extra/23076141
//It replaces the tabs in the infid with spaces and writes it to a outfid with spaces.
//If you want to replace the original file's tabs do the following
// uncomment lines 29 and 30 below: "del %textfile"" and "rename %newfile %textfile"
// change the Open( outfid, ..) to Open(infid, ...) in line 38
//To keep outfid, don't make the changes described above. But comment or delete the last JSL statement
dos_cmds = {
"cd c:\temp",
"@echo off &setlocal",
EvalInsert("set \!"search=%^findchar^\!""),
"set \!"replace=% \!"",
EvalInsert("set \!"textfile=^infid^\!""),
EvalInsert("set \!"newfile=^outfid^\!""),
"(for /f \!"delims=\!" %%i in (%textfile%) do (",
" set \!"line=%%i\!"",
" setlocal enabledelayedexpansion",
" set \!"line=!line:%search%=%replace%!\!"",
" echo(!line!",
" endlocal",
"))>\!"%newfile%\!""
// , "del %textfile%",
// "rename %newfile% %textfile%"
};
txt = concat items(EvalList(dos_cmds), "\!N");
f = Save Text File("c:\temp\Find_Replace.bat", txt, Mode("replace"));
Web("c:\temp\Find_Replace.bat"); //simple command to execute a .bat
dt = Open( outfid,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Spaces, Space, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 0 ),
Column Names Start( 1 ),
Data Starts( 1 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
If( File Exists(outfid), Delete File(outfid) );
これは、JSL を使用してさまざまな方法で実行できますが、これを対話的に実行したいと仮定して、次の方法で実行します。
- 「テーブル」==>「スタック」に移動し、列 1 ~ 5 を新しいデータテーブルにスタックします。
- 新しいテーブルで、欠落しているセルの 1 つを右クリックし、[一致するセルの選択] を選択します。
- 欠損値のある行を削除します
- 「列」という名前の新しい列を作成し、列の列情報でデータを「シーケンス データ」に初期化するように指定します。開始値は 1、終了値は 5 (スタックされた列の数)、ステップ値は次のとおりです。 ~ 4 (元のデータテーブルの行数)
- 次に、[テーブル]==>[分割] に移動し、[分割] 選択項目として「列」という名前の列を選択し、分割列として「データ」という名前の列を選択します。
- 結果として得られる新しいデータ テーブルでは、Tables==>Update を実行するか、単に切り取りと貼り付けを実行して、新しい結果を元のデータ テーブルにコピーして戻すことができます。