4

この固定幅の ASCII ファイルを読み取る方法を Stata 用に定義する Stata .dct ファイルの次の数行を検討してください(任意のプラットフォームの任意の ZIP ソフトウェアで解凍できます)。

start             type                            varname width  description
_column(24)       long                               rfv1   %5f  Patient's Reason for Visit #1            
_column(29)       long                               rfv2   %5f  Patient's Reason for Visit #2             
_column(34)       long                               rfv3   %5f  Patient's Reason for Visit #3             
_column(24)       long                             rfv13d   %4f  Patient's Reason for Visit #1 - broad     
_column(29)       long                             rfv23d   %4f  Patient's Reason for Visit #2 - broad     
_column(34)       long                             rfv33d   %4f  Patient's Reason for Visit #3 - broad     

基本的に、この ASCII ファイルの各行の 24 番目から 39 番目の文字は次のようになります。

AAAAaBBBBbCCCCc

最初の大まかなコードがAAAAである場合、同じ理由でより狭いコードはAAAAaなどです。

つまり、コード自体が階層構造を持っているため、すべての行の同じ文字が 2 回読み取られて、2 つの異なる変数が作成されます。

read.fwf対照的に、widthsこのタイプの二重読み取りを排除する引数を取るだけです。

scanこれを処理する標準的な方法はありますか?ファイル全体で ning を使用してホイールを最初から再作成し、手動で解析する必要はありませんか?

ここでの背景は、これらの .DCT ファイルを解析する関数を SAScii のスタイルで作成していること(start, width)ですwidths

4

2 に答える 2

6

私は .DCT パーサーの作業を開始しましたが、気力を失いました。私の意図した使用シナリオは、実際には単純にファイルを解析し、csvkit スキーマ ファイルを作成して、csvkit を使用してファイルを固定幅から csv に変換できるようにすることでした。そのために、パッケージは成功しましたが、非常に洗練されておらず、最小限のテストしか行われていません。

(1) すべての DCT ファイルが同じ列を持っているわけではありません。(2) 一部の DCT ファイルには、暗黙的な小数点以下の桁数の指示があり、それらの種類のファイルを処理する方法を考え出すことはできませんでした。

パッケージの最初の作業は、ここで見つけることができます。

主な機能は次のとおりです。

  • dct.parser-- 期待どおりの結果が得られます。最初の数行を読み取る「プレビュー」引数があり、DCT ファイルに期待するすべての列があるかどうかを判断できます。
  • csvkit.schema-- から抽出された情報を使用して、csvkit からdct.parser必要な関連列を含む csv ファイルが作成されます。in2csv
  • csvkit.fwf2csv-- 基本的systemに csvkit への呼び出し。Rの外でもできます。

あなたの特定の例では、次を使用して正常に読み取りました。

## The extracted data file and the DCT file are in my downloads directory
setwd("~/Downloads/") 
dct.parser("ed02.dct", preview=TRUE) ## It seems that everything is there
temp <- dct.parser("ed02.dct")       ## Can be used as a lookup table later

## The next line automatically creates a csv schema file in your 
##   working directory named, by default, "your-dct-filename.csv"
csvkit.schema(temp) 
csvkit.fwf2csv(datafile = "ED02", schema="ed02.dct.csv", output="ED02.csv")

## I haven't set up any mechanism to check on progress...
## Just check the directory and see when the file stops growing :)
ED02 <- read.csv("ED02.csv")

私が取り組みたいと思っていた (しかし決してしなかった) 別の代替案は、列に重複データが含まれているデータを読み取るために使用できるコマンドをpaste作成するために使用することでした。開始するための例については、このブログ投稿を参照してください。substrsqldf


更新:sqldf

前述のように、sqldfを使用して の出力を有効に活用dct.parserし、データを読み込むことができますsubstr。これを行う方法の例を次に示します。

## The extracted data file and the DCT file are in my downloads directory
setwd("~/Downloads/") 
temp <- dct.parser("ed02.dct")       ## Can be used as a lookup table later

## Construct your "substr" command
GetMe <- paste("select", 
               paste("substr(V1, ", temp$StartPos, ", ",
                     temp$ColWidth, ") `", temp$ColName, "`", 
                     sep = "", collapse = ", "), 
               "from fixed", sep = " ")

## Load "sqldf"
library(sqldf)

fixed <- file("ED02")
ED02 <- sqldf(GetMe, file.format = list(sep = "_"))
dim(ED02)
# [1] 37337   260

ご覧のとおり、ラインに少し変更が必要でしたsqldf。特に、sqldfを使用しread.csv.sqlているため、データ内のコンマ文字が区切り文字として認識されていました。それをデータで予期しないものに変更するだけです。

于 2013-04-23T16:28:09.043 に答える