4

番号のリストを含むファイルがあります (自分で作成してください: for x in $(seq 10000); do echo $x; done > file)。

$> R -q -e "x <- read.csv('file', header=F); summary(x);"

> x <- read.csv('file', header=F); summary(x);
       V1       
 Min.   :    1  
 1st Qu.: 2501  
 Median : 5000  
 Mean   : 5000  
 3rd Qu.: 7500  
 Max.   :10000  

catここで、ファイルの ing と read fromの出力が同じであると期待するかもしれ/dev/stdinませんが、そうではありません。

$> cat file | R -q -e "x <- read.csv('/dev/stdin', header=F); summary(x);"
> x <- read.csv('/dev/stdin', header=F); summary(x);
       V1       
 Min.   :    1  
 1st Qu.: 3281  
 Median : 5520  
 Mean   : 5520  
 3rd Qu.: 7760  
 Max.   :10000 

を使用table(x)すると、一連の行がスキップされたことがわかります。

    1  1042  1043  1044  1045  1046  1047  1048  1049  1050  1051  1052  1053 
    1     1     1     1     1     1     1     1     1     1     1     1     1 
 1054  1055  1056  1057  1058  1059  1060  1061  1062  1063  1064  1065  1066 
    1     1     1     1     1     1     1     1     1     1     1     1     1
 ...

stdinこのPythonはファイル内のすべての行を適切に出力するため、Rは で何かおかしなことをしているようです:

cat file | python -c 'with open("/dev/stdin") as f: print f.read()'

この質問は関連しているようですが、不正な形式の CSV ファイルの行をスキップすることに関するものですが、私の入力は単なる数字のリストです。

4

1 に答える 1

3

head --bytes=4K file | tail -n 3

これを生成します:

1039
1040
104

これは、Rが/ dev / stdinにサイズ4KBの入力バッファーを作成し、初期化中にそれを埋めることを示唆しています。次にRコードが/dev/ stdinを読み取ると、この時点でファイルから開始されます。

   1
1042
1043
...

実際、ファイル内で行をに置き換える1041と、 :1043に「1」ではなく「3」が表示されます。table(x)

3  1042  1043  1044  1045  1046  1047  1048  1049  1050  1051  1052  1053 
1     1     1     1     1     1     1     1     1     1     1     1     1 
...

最初1table(x)は、実際にはの最後の桁です1041。ファイルの最初の4KBが食べられました。

于 2012-06-21T13:38:53.280 に答える