2017-09-18 18 views
0

約9列と9000行以上の大きな.csvファイルを1行ごとに別々の.txtファイルに分割し、最初の列の名前。r - 1つのcsvファイルを複数のtxtファイルに分割する

.csvファイルのための :

01001_r1 32.4327 -86.6190 0.65 0.20 0.15 1.33 5.47 8 
01001_r2 32.4327 -86.6190 0.65 0.20 0.15 1.33 5.46 8 
01001_r3 32.4327 -86.6190 0.80 0.15 0.05 1.33 5.23 10 
01003_r1 30.4887 -87.6918 0.65 0.20 0.15 1.33 5.23 9 
01003_r2 30.4887 -87.6918 0.80 0.15 0.05 1.33 5.25 9 
01003_r3 30.4887 -87.6918 0.65 0.20 0.15 1.33 4.96 8 

私は1行ごとに、6つのファイルで終わるでしょう。

出力ファイルの列は「タブ区切り」にする必要があり、ファイルに行または列名が含まれていてはなりません。出力ファイルなど

は次のようになります。

01001_r1 32.4327 -86.6190 0.65 0.20 0.15 1.33 5.47 8 

これは私がこれまでのところ得ているところである:

#set 'working directory' 
setwd('C:/Users/Data/soils_data/sitesoil_in') 

#identify data frame from .csv file 
sd <- read.csv('site_soil.csv', sep="\t", header=F, fill=F) 

lapply(1:nrow(sd), function(i) write.csv(sd[i,], 
             file = paste0(sd[i,1], ".txt"), 
             row.names = F, header = F, 
             quote = F)) 

そして、これは私が各出力ファイルのために得るものです:

ファイル名:01001_r1

V1,V2,V3,V4,V5,V6,V7,V8,V9 
01001_r1,32.4327,-86.619,0.65,0.2,0.15,1.33,5.47,8 

列名を削除したり、列をタブで区切ったりすることはできません。 見出しを取り除くためにheader = F、またはcol.names = Fを試しましたが、sep = "\ t"で列を区切りますが、コマンドは認識されません。

私は助けていただきありがとうございます。 おかげで、すべての提案に続い E.

、これはトリックを行うだろうシンプルなコードです:

#set 'working directory' 
setwd('C:/Users/Elena/Desktop/DayCent_muvp_MODEL/DayCent_SourceData/soils_data/sitesoil_in') 

#identify data frame from .csv file 
sd <- read.csv('site_soil.csv', sep="\t", header=F, fill=F) 

lapply(1:nrow(sd), 
     function(i) write.table(sd[i,], 
           file = paste0(sd[i,1], ".txt",collapse = ""), 
           row.names = FALSE, col.names = FALSE, 
           sep = "\t" 
     )) 

はあなたの助けありがとうございました。 E.

+2

check write.table - あなたのアプローチは、あなたの場合には望ましくない.csvとして再度保存します。これは、何千もの.txtファイルをディスクに散らすだけの便利な目的の背後にある意図を説明できますか? – Christian

+0

クリスチャン、ありがとう、私はそれを試みましたが、write.csvの代わりにwrite.tableを使用すると私にエラーが発生します...これらは、モデル入力のファイルを生成する別のコードの入力ファイルです。後のコードでは、これらのファイルを情報を認識するための非常に特殊な形式にする必要があります。 – EBB

+0

あなたはその時に与えられたエラーを調査したいと思うでしょう。 'write.csv'はdocs('?write.table')で記述されている 'write.table'のラッパーであり、柔軟性を持たないことを意図していません。私の経験では、 'write.table'を使い、' write.csv'を使うのではなく、必要な正しい引数を手動で指定して、あなたの必要とする引数があることを願っています。 – user5359531

答えて

1

を私はあなたのコードを調整する:

lapply(1:nrow(sd), 
    function(i) write.table(sd[i,], 
          file = paste0(sd[i,1],".txt",collapse = ""), 
          row.names = FALSE, 
          sep = "\t" 
          )) 
+0

それは動作します!ありがとう!!なぜそれ以前にwrite.tableを認識しないのですか?今は列名を削除する方法を理解する必要があります。再度、感謝します! – EBB

1

この

dat <-"01001_r1,32.4327,-86.6190,0.65,0.20,0.15,1.33,5.47,8 
01001_r2,32.4327,-86.6190,0.65,0.20,0.15,1.33,5.46,8 
01001_r3,32.4327,-86.6190,0.80,0.15,0.05,1.33,5.23,10 
01003_r1,30.4887,-87.6918,0.65,0.20,0.15,1.33,5.23,9 
01003_r2,30.4887,-87.6918,0.80,0.15,0.05,1.33,5.25,9 
01003_r3,30.4887,-87.6918,0.65,0.20,0.15,1.33,4.96,8 
" 


df <- read.delim(file = textConnection(dat), sep = ',', header = FALSE) 

df 
#   V1  V2  V3 V4 V5 V6 V7 V8 V9 
# 1 01001_r1 32.4327 -86.6190 0.65 0.20 0.15 1.33 5.47 8 
# 2 01001_r2 32.4327 -86.6190 0.65 0.20 0.15 1.33 5.46 8 
# 3 01001_r3 32.4327 -86.6190 0.80 0.15 0.05 1.33 5.23 10 
# 4 01003_r1 30.4887 -87.6918 0.65 0.20 0.15 1.33 5.23 9 
# 5 01003_r2 30.4887 -87.6918 0.80 0.15 0.05 1.33 5.25 9 
# 6 01003_r3 30.4887 -87.6918 0.65 0.20 0.15 1.33 4.96 8 

output_file_base <- "soil_" 
output_file_ext <- ".tsv" 

for(i in seq(nrow(df))){ 
    output_file <- paste0(output_file_base, as.character(i), output_file_ext) 
    dfi <- df[i, ] 
    write.table(x = dfi, file = output_file, sep = '\t', quote = FALSE, col.names = FALSE, row.names = FALSE) 
} 

出力してみてください。

$ cat soil_6.tsv 
01003_r3 30.4887 -87.6918 0.65 0.2 0.15 1.33 4.96 8 
+0

もう一度ありがとうございます。私はdfに変換しようとしましたが、限られたデータに対してはうまく機能します。問題は、9,000以上の行で8,000行のコードで終わることです...私はより簡単な解決策を見つけようとしていました... – EBB

+0

col.names引数のコンマがありませんでした。面白い。私はあなたのコードを見直し、あなたの助けをもう一度感謝した。 – EBB

+0

"問題は、9,000以上の行では8,000行のコードで終了するということです。これで何を意味するのか分かりませんが、CSVファイルの内容全体をスクリプトに埋め込んでいないことを祈っていますか?元の投稿は、CSVを直接dfに読み込んでいることを示しています。私はあなたがこれを超えて必要な他のコード行を明確にしていません。 – user5359531

1

これはあなたが達成しようとしているもののために働くことがあります。

df <-read.csv(text = "01001_r1,32.4327,-86.6190,0.65,0.20,0.15,1.33,5.47,8 
01001_r2,32.4327,-86.6190,0.65,0.20,0.15,1.33,5.46,8 
01001_r3,32.4327,-86.6190,0.80,0.15,0.05,1.33,5.23,10 
01003_r1,30.4887,-87.6918,0.65,0.20,0.15,1.33,5.23,9 
01003_r2,30.4887,-87.6918,0.80,0.15,0.05,1.33,5.25,9 
01003_r3,30.4887,-87.6918,0.65,0.20,0.15,1.33,4.96,8", 
stringsAsFactors = FALSE, 
header = FALSE) 


apply(df, 1, function(x){write.table(t(x), 
            file = paste0(x[1],".txt"), 
            sep = "\t", 
            quote = FALSE, 
            col.names = FALSE, 
            row.names = FALSE)}) 
+0

ありがとうございました。私はdfに変換しようとしましたが、限られたデータに対してはうまく機能します。問題は、9,000以上の行で8,000行のコードで終わることです...私はもっと簡単な解決策を見つけようとしていました...いずれにしても、後で使用するためにコードを保存します。 – EBB

関連する問題