0

このようなエラーで次のコードを実行しています。

> rat <- scan("sortedratings.csv",nlines=760,sep=",",what=rat.cols,multi.line=FALSE);                                                       
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :                                                                         
  line 755 did not have 8 elements                                                                                                                    
>    

そして、これがすべての問題を引き起こしている行です

ubuntu@ip-10-28-6-239:/data/csv$ sed -n "750,760p" sortedratings.csv                                                                                  
"281656475","2.5.0","Jul 17, 2011","","","KK9876",4,0                                                                                                 
"281656475","2.5.0","Jul 17, 2011","","","Lyteskin45",4,0                                                                                             
"281656475","2.5.0","Jul 17, 2011","","","Mrs. Felton",5,0                                                                                            
"281656475","2.5.0","Jul 17, 2011","","","Nick Bartoszek",4,0                                                                                         
"281656475","2.5.0","Jul 17,2011","","","SANFRANPSYCHO",5,0                                                                                          
"281656475","2.5.0","Jul 17, 2011","","","Wxcgfduytrewjgf@!?$(:@&amp;&amp;$&amp;@\"",5,0                                                              
"281656475","2.5.0","Jul 18, 2011","","","Downs58",5,0                                                                                                
"281656475","2.5.0","Jul 18, 2011","","","kitty1019",5,0                                                                                              
"281656475","2.5.0","Jul 18, 2011","","","Rj&amp;e",4,0                                                                                               
"281656475","2.5.0","Jul 18, 2011","","","Robin Kinzer",5,0                                                                                           
"281656475","2.5.0","Jul 18, 2011","","","Roderick Palmer",5,0                                                                                        
ubuntu@ip-10-28-6-239:/data/csv$ s

さまざまな修正を試みましたが、正しい修正がわかりません。何か案が?

テキストなどのバックスラッシュを削除しても問題はありません。

ああ、追加するのを忘れていましたが、ファイルは 1.4GB 大きいので、システムには大きすぎるため、すべてのファイルを読み取ったり、単に sed に置き換えたりすることはできません。

4

1 に答える 1

4

?scan( などで使用されるread.table)の「詳細」部分read.csv:

 If ‘sep’ is non-default, the fields may be quoted in the style of
 ‘.csv’ files where separators inside quotes (‘''’ or ‘""’) are
 ignored and quotes may be put inside strings by doubling them.
 However, if ‘sep = "\n"’ it is assumed by default that one wants
 to read entire lines verbatim.

したがって、問題は\"その行の「エスケープされた」引用符が問題を引き起こしているようです-Rは、CSVのエスケープされた""引用符がバックスラッシュされた引用符ではなく二重引用符であると想定しています\"

ここでの最善の策は、Linux を使用しているか R を使用しているかにかかわらず、エスケープされた引用符を二重引用符に置き換えることだと思います (以下の R の例)。

txt <- readLines("tmp.txt")
txt <- gsub('\\\\"', '""', txt) # note the weird double backslashing because
                                # `readLines` adds extra backslashes
# if you `cat(txt, sep='\n')` you will see that the `\"` is now `""`

read.csv次に、前にor scanlikeを使用できます(使用するtextConnection(txt)ために文字列をファイルのようなオブジェクトに変換することに注意してくださいscan):

read.csv(textConnection(txt), ...)

編集・追加

OPのコメントについて-ファイルは1.4GBで、一度にすべてをRに読み込むのは難しいので、サニタイズを行う方法は?

オプション1

あなたはLinuxを使用しているように見えるので、次を使用できますsed

sed -ire 's!\\"!""!g' myfile.txt

(データの取得元によっては、データを出力しているプログラムを調整して、最初に必要な形式で出力することもできますが、常に可能であるとは限りません)。

オプション 2

Linux の使用に抵抗がある場合、または社内の R ソリューションが必要な場合は、nパラメーターを使用readLinesして、一度に数行だけを読み取ります。

# create the file object and open it, see ?file
f <- file('tmp.txt')
open(f)
txt <- ''

# now read in 100 lines at a time, say
while (length(txt)) {
    txt <- readLines(f, n=100)
    # now do the sanitizing/coercing into a data frame, store.
    # ...
}
close(f)
于 2012-11-20T02:02:34.440 に答える