2017-12-12 12 views
2

私は多くのファイルを読んでいます。ファイルの形式は以下のとおりです。次の形式のファイルを読む方法

これを読むために多くのパッケージフォーマットを試しましたが、どれも動作していないようです。 " - "で始まる行はスキップする必要があります。ファイルには約102列ありますが、ほんの少ししか表示されていません。 " - "で始まる行は、実際には1行目、3行目および最後の行にあります。

明らかdata.table

temp <- fread(input="LIKP_01012017_01312017.txt", 
       stringsAsFactors=FALSE, strip.white=TRUE, 
       sep="|",quote = "-", skip=1) 

を使用してread.tableを

temp <- read.delim(file="LIKP_01012016_01312016.txt", header=TRUE, 
        stringsAsFactors=FALSE, 
        strip.white=TRUE, sep="|", skip = 1, comment.char = "-") 

を使用して:

ファイルは、私は次のことを試してみました

------------------------------------------------ 
|Delivery |Created by |Time |Created on|SDst| 
------------------------------------------------ 
|84181375 |BATCHJOBMGR|19:33:47|01/05/2017| | 
|84181376 |BATCHJOBMGR|19:33:47|01/05/2017| | 
------------------------------------------------ 

次の形式であります私はやっていないg何か正しい。これらのファイルを読んで助けてくれますか?

ありがとうございます。

サティシュ

+1

ファイル 'で区切ら|' CSVやTSV(タブ区切り)に似た、PSV(パイプ区切り値)と呼ばれています。そして '------------------'行は無視します。それらを削除するために1つの前処理パスを実行することがあります。 3行目はヘッダーですが、2行目のみ意味があります。 – smci

答えて

5

1)だけマイナス符号が破線であるサンプルデータに。それがあなたの実際のデータにも当てはまるなら、次のことがうまくいくはずです。 text = Lines"LIKP_01012016_01312016.txt"に置き換えてください。 comment.char = "-"は、マイナスの行にマイナスがあり、その行の後のすべてが無視され、マイナスの行が空白行になることに注意してください。

read.table(text = Lines, header = TRUE, sep = "|", as.is = TRUE, 
     comment.char = "-", check.names = FALSE, strip.white = TRUE)[2:6] 

寄付:

Delivery Created by  Time Created on SDst 
1 84181375 BATCHJOBMGR 19:33:47 01/05/2017 NA 
2 84181376 BATCHJOBMGR 19:33:47 01/05/2017 NA 

あなたがデータでマイナス記号を持っている場合は、単に、最初の行をスキップしfill = TRUEを使用し、最初と最後の行を削除(残りのものですすべてのマイナス記号付き)。

DF <- read.table(text = Lines, header = TRUE, sep = "|", as.is = TRUE, 
     skip = 1, fill = TRUE, check.names = FALSE, strip.white = TRUE)[2:6] 
n <- nrow(DF) 
DF <- DF[-c(1, n), ] 

注:上記のコードのための入力は次のとおりです。

Lines <- "------------------------------------------------ 
|Delivery |Created by |Time |Created on|SDst| 
------------------------------------------------ 
|84181375 |BATCHJOBMGR|19:33:47|01/05/2017| | 
|84181376 |BATCHJOBMGR|19:33:47|01/05/2017| | 
------------------------------------------------" 
+0

「comment.char」のトリックと、なぜこの日が本当にここに保存されるのか+1を説明してください。 –

+0

こんにちはMr. Grothendieck:ありがとうございます。私のファイルはそれぞれ90 MBを超え、そのうち約25個です。だから私はあなたの提案にどのように従うことができるのだろうか?ありがとう、Satish –

+0

最も簡単なのはちょうどそれを試すことです。 –

0

あなたが入力ファイルのそれぞれを修正するためにsystem()コマンドを使用することができます。以下は、sedユーティリティを使用しているLinuxの場合です。 -で始まるすべての行が削除されます(sed '/^-/d')。さらに、先頭と末尾のパイプ(|)文字もすべて削除されます(sed 's/^|//'およびsed 's/|$//')。出力は|として、セパレータを指定して、通常のread.csvコマンドで読み込むことができ、一時ファイルに保存することができます。

> system("cat LIKP_01012016_01312016.txt | sed '/^-/d' | sed 's/^|//' | sed 's/|$//' > temp.csv") 
> dd = read.csv('temp.csv', na.strings='', sep="|") 
> dd 
    Delivery Created.by  Time Created.on SDst 
1 84181375 BATCHJOBMGR 19:33:47 01/05/2017 NA 
2 84181376 BATCHJOBMGR 19:33:47 01/05/2017 NA 

上記は、すべてのファイルを一つずつ変換して読み取ることがforループに入れることができます。

+0

OPは完全にプログラミング言語_になっていて、 'sed'の機能は焼き付けられています。これは意味がありません。 – hrbrmstr

0

異なるアプローチ:

con <- file('path/to/file.txt') 

d <- readLines(con) 

d <- read.delim(textConnection(d[!grepl("-", d)]), sep = '|')[2:6] 
関連する問題