2

データ構造: Excel または CSV ファイルとして読み取ることができるデータ セットがあります。次の変数タイプがあります: 日付、時刻、数値変数、および数値に誤って文字が付加されている数値変数であるべきもの- 例: -0.011* および 0.023954029324) (最後の括弧はセル内にあります) -ファイルを書き込んだプログラムのエラー。また、すべてのレコード間に空白行があり、何百ものファイルを管理しているため、これらをすべて削除するのは現実的ではありません。

データの問題: 一部の値は文字までは正しい (つまり、アスタリスクが削除されている限り -0.011 は正しい) と判断しましたが、0.023954029324 などの他の値は完全に正しくなく、欠落させる必要があります。この問題についてはコメントしないでください。この問題は私の手に負えません。この時点で私にできることは、エラーが修正され、文字値がファイルに書き込まれなくなるまで、データを管理することだけです。

SAS の問題:

1) Excel ファイルで PROC IMPORT を使用すると、SAS は最初の 8 行 (CSV ファイルの場合は 20 行) を使用して、変数が数値か文字かを判別します。かっこのアスタリスクが最初の 20 行以内に出現しない場合、SAS は変数が数値であると判断し、それ以降の文字値が欠落しているセルを作成します。アスタリスクの場合、値の数値部分を保持し、後のデータ ステップでアスタリスクを削除したいので、これは問題ありません。PROC IMPORT を使用して Excel ファイルをインポートする場合、GUESSINGROWS オプションは使用できません (CSV ファイルの場合と同様、以下を参照)。編集:また、MIXED=YESオプションは機能しません(以下のコメントを参照してください-SASが使用する行数を変更する必要があります。これは、私にとって、このオプションが...何をすることを意味しますか?)。

2) CSV ファイルで PROC IMPORT を使用する場合、GUESSINGROWS=32767 を指定できます。これにより、アスタリスクのある変数が文字であると判断され、アスタリスクが維持されるため、非常に興奮します。ただし、非常に奇妙なことに、括弧を含む変数を文字として判断しなくなりました (括弧が最初の 20 行にある限り、Excel ファイルをインポートするときに行われるように)。代わりに、文字を削除し、さらに値を四捨五入します。最も近い整数 (0.1435980234 は 0、1.82149023843 は 2 など)。これは丸めが粗すぎるため、小数点以下の桁数を維持する必要があります。その上、括弧がなくなったので、適切なセルを欠落させることはできません。SASを丸めたり、括弧を維持したりしないようにする方法があるかどうかはわかりません。私に、これは一貫性のない動作です。この場合、括弧ではなくアスタリスクが文字と見なされるのはなぜですか? また、PROC IMPORT((1)で説明)を使用してExcelファイルを読み込むと、かっこで対処できます (最初の 20 行に表示される場合) - 別の矛盾。

3) INFILE を使用すると、読み込もうとするすべての変数でエラーが発生します。この手順は、データがどのように変化するかについて非常に敏感で不安定です (そして、空白の回避策をコーディングする必要があります)。データライン)。

ULTIMATE GOAL (重要な場合、このコードはマクロ内で自動的に実行されることに注意してください):

1) 日付変数を日付として読み取る

2) 時間変数を時間として読み取る

3) その変数の任意のセルに文字が存在する変数 (20 行後でも) を文字変数として識別し、セル内の値を維持できる (つまり、文字を丸めたり削除したりしないでください)。これは、特定の変数のセットを文字にするようにSASにアプリオリに指示することによって(文字を削除したり、セルを欠落させたりした後にそれらを数値に変更します)、またはSASが文字を含む変数を独自に識別することによって行うことができます。

4

1 に答える 1

1
  1. 実際、SAS はデフォルトで最初の 8 行を使用します。これは、レジストリ設定で定義されます。TYPEGUESSROWSこれは、通常、HKLM\Software\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows\ (または、オフィスのバージョンをそこに挿入) に格納されます。その値を FFFF (16 進数)/65536 (10 進数) またはその他の大きな数値に変更するか、ゼロに変更して最大行数を検索します (16000 を少し超える - 正確な数を見つけるのは困難です)。

  2. CSV ファイルの場合、データ ステップ インポートを記述して、各変数の形式を制御できます。これを確認する最も簡単な方法は、PROC IMPORT を実行してからログを確認することです。ログには、データ ステップでファイルを読み込むために使用される完全なコードが含まれます。次に、必要に応じて情報を変更します。あなたは Infile メソッドに問題がありすぎると言っているので、おそらくこれはうまくいかないでしょうが、通常は矛盾を回避することができます - そして、あなたのファイルがそんなに矛盾しているなら、あなたは大量の手作業をしているように思えます.とりあえず。これにより、日付/時刻変数を正しく読み取るオプションも提供されます。

  3. また、PROC IMPORT/CSV をログに使用して、ログをファイルに書き込んでから、それを読み込んで新しいインポート コードを独自に生成することもできます。生成されたファイルの proc コンテンツから離れて、既知の変更を加えることもできます。

質問の最初の部分で問題について言及していないため、日付/時刻について何を尋ねているのかわかりません。

追加のオプションの 1 つは、(CSV から) 読み込む前に文字を削除することです。本当に数字とコンマ (および小数点と負符号) だけである場合、これは非常に単純です。

data mydata;
infile myfile /*options*/;
input @@;
length infileline $32767; *or your longest reasonable line;
infileline = compress(_infile_,'.-','kd');
run;

data _null_;
set mydata;
file myfile /*options*/ /*or a new file if you prefer */;
put @1 infileline $32767.; *or your longest reasonable line;
run;

次に、proc import を使用してその新しいファイルを読み取ります。見やすいように 2 つのデータステップに分割していますが、実行しやすいように 1 つにまとめることができます。SAS のドキュメントで「ファイルの更新」を参照してください。OS 固有のツールを使用してこのクリーニングを実行することもできます。たとえば、Unix では、短い awk スクリプトで、動作の悪い文字を簡単に削除できます。

于 2013-07-23T16:28:57.997 に答える