1

最終的なリグレッション、ビジュアライゼーションなどのために、一連の大規模 (〜 300M) および非常に大規模 (〜 4G) の固定幅ファイルを読み込もうとしています (そして最終的にはマージ/リンク/操作)。

まず、ファイル自体の形式が奇妙です。SQL のようなものだと思います。ファイル形式は、 https ://msdn.microsoft.com/en-us/library/ms191479.aspx で参照できます 。それは固定幅ですが、最後の列は (時々?) その列の完全な固定幅が経験される前に \r\n で途切れているようです。それを読むために、laf_open_fwf と data.table::fread を試しましたが、どちらも混乱しているようです。サンプル ファイルと関連する非 XML 形式の記述子は、こちら にあります。あの間抜けな最後のコラムでは、適切に読み取ることすらできません。ファイルのサンプルを次に示します。

1           1           7           7           ER
2           2           9           8           OI
3           54016       1988006     1953409     OI        
4           54017       1988014     1953415     ER        
5           54017       1988014     1953415     OB        

(ただし、CR/LF はここでは見えず、問題はそれらの奇妙な配置であることに注意してください。上記の .txt ファイルまたは png ファイルへのリンクを参照してください (リンクできません、低担当者) のメモ帳 ++ ビューのフィールドの問題を実証するためのデータ。)

次に、ファイル サイズが問題です。やらなければならないテーブル操作がたくさんあることはわかっているので、data.table を見てみたくなるのですが、data.table はオブジェクト全体を RAM に格納すると考えており、これは問題になるでしょう。LaF、ffdf、または sqlite はオプションのようですが、私はそれらに慣れていないため、最初にこのファイル形式の問題に対処する必要があります。

LaF、ffbase、またはdata.tableが以下にあることを示唆する、この一般的なアイデアに関するいくつかの質問があります...

固定幅のビッグデータの読み取り

R で非常に大きなテーブルをデータフレームとしてすばやく読み取る

R で固定幅形式のテーブルのインポートを高速化

...しかし、(1) この奇妙な固定幅っぽい形式を処理したり、(2) データを最終的に data.tables に移動したりするものはないようです。これを最初に試してみたいと思います。私は、それらを開いて適切にフォーマットされた CSV として書き直して、data.table で処理できるようにすることを考えました (data.frames を介して csv に戻る私の間抜けなハックは、ばかげており、スケーラブルではないように感じます)。また、CSV エクスポートは、ファイルがどのように混乱するかを示しています。これは、laf リーダーが /r/n の場所に基づいて調整するのではなく、厳密にフィールド長を使用しているためです...

現在、私は手始めに以下のようなものを試しています。可能であれば、助けてください。

require("data.table", "LaF", "ffbase")
searchbasis.laf = laf_open_fwf("SEARCHBASIS.txt",
                               column_widths = c(12, 12, 12, 12, 10), 
                               column_names = c("SearchBasisID", "SearchID", "PersonID", "StopID", "Basis"),
                               column_types = rep("string",5),
                               trim = T)
# ^ The laf_open_fwf quietly "fails" because the last column doesn't always 
# have 10 chars, but sometimes ends short with /r/n after the element.
searchbasis.dt = as.data.table(as.data.frame(laf_to_ffdf(searchbasis.laf)))
write.csv(searchbasis.dt, file="SEARCHBASIS.csv")
# ^ To take a look at the file.  Confirms that the read from laf, transfer 
# to data.table is failing because of the last column issue.
4

2 に答える 2

2

最近の修正により、fread()複数のスペースを含む行を問題なく読み取ることができるようになりました (v1.9.5+ devel)。strip.white引数 (=TRUEデフォルト):

require(data.table) # v1.9.5+
fread("1           1           7           7           ER
2           2           9           8           OI
3           54016       1988006     1953409     OI        
4           54017       1988014     1953415     ER        
5           54017       1988014     1953415     OB        
")
#    V1    V2      V3      V4 V5
# 1:  1     1       7       7 ER
# 2:  2     2       9       8 OI
# 3:  3 54016 1988006 1953409 OI
# 4:  4 54017 1988014 1953415 ER
# 5:  5 54017 1988014 1953415 OB

これがあなたのケースでうまくいくことを願っています。そうでない場合はお知らせくださいfread()。devel バージョン (プロジェクト ページのインストール手順を参照) にアップグレードするか、次の CRAN バージョン (v1.9.6 など) を待ちます。

于 2015-09-17T00:23:34.807 に答える
2

この特定のファイルの場合:

form <- read.table("SEARCHBASIS_format.txt", as.is = TRUE, skip = 2)
x <- read.table("SEARCHBASIS.txt", col.names = form$V7, as.is = TRUE)

スペースを含む文字列が時々ある場合は、ほぼ確実に、最初にファイルを外部で処理する必要があります。

非常に大きなファイルを読み取る予定がある場合は、次のことをお勧めします (パスに awk があると仮定します):

x <- setNames(data.table::fread("awk '{$1=$1}1' SEARCHBASIS.txt"), form$V7)

固定幅を使用する場合は、次を使用できます。

x <- setNames(fread("gawk 'BEGIN {OFS = \"\t\"; FIELDWIDTHS = \"12 12 12 12 12\"} {for (i = 1; i<= NF; i++) {gsub(/ +$/, \"\", $i);}}1' SEARCHBASIS.txt"), form$V7)

フォーマット ファイルから幅を取得することもできます。

x <- setNames(fread(paste0("gawk 'BEGIN {OFS = \"\t\"; FIELDWIDTHS = \"", paste(form$V4, collapse = " "), "\"} {for (i = 1; i<= NF; i++) {gsub(/ +$/, \"\", $i);}}1' SEARCHBASIS.txt")), form$V7)

awk にフィールドの再評価を強制することに注意してください。$1=$1最後の 1 は実質的に の短縮形ですprint。また、各フィールドから末尾のスペースを削除したいと考えています。

Windows では、R で一重引用符を使用し、コマンド内の一重引用符を " に置き換え、ネストされた二重引用符を "" に置き換える必要があります。したがって、上記の最後のものは次のようになります。

x <- setNames(fread(paste0('gawk \"BEGIN {OFS = ""\t""; FIELDWIDTHS = ""', paste(form$V4, collapse = " "), '""} {for (i = 1; i<= NF; i++) {gsub(/ +$/, """", $i);}}1" SEARCHBASIS.txt')), form$V7)

クロスプラットフォーム ソリューションの場合、awk スクリプトを外部ファイルに配置する必要があります。

stripSpace.awk

BEGIN {OFS="\t"} {for (i = 1; i<= NF; i++) {gsub(/ +$/, "", $i);}}1

Rコード

x <- setNames(fread(paste0('gawk -v FIELDWIDTHS="', paste(form$V4, collapse = " "), '" -f stripSpace.awk SEARCHBASIS.txt')), form$V7)

Scientific Linux 6 および Windows 8.1 でテスト済み

于 2015-06-28T21:40:43.617 に答える