2017-09-18 2 views
0

Je dois diviser un grand fichier .csv, avec environ 9 colonnes et plus de 9 000 lignes, dans un fichier .txt distinct pour chaque ligne, et nommer chaque nouveau fichier par le nom dans sa première colonne.r - diviser un fichier CSV en plusieurs fichiers txt

par exemple. pour le fichier .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 

je finirais avec 6 fichiers, avec une ligne chacun. Les colonnes du fichier de sortie doivent être séparées par des tabulations et le fichier ne doit pas contenir de noms de lignes ou de colonnes.

par exemple les fichiers de sortie devrait ressembler à ceci:

01001_r1 32.4327 -86.6190 0.65 0.20 0.15 1.33 5.47 8 

C'est là où je suis arrivé jusqu'ici:

#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)) 

Et voici ce que je reçois pour chaque fichier de sortie:

nom de fichier: 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 

Je ne peux pas l'obtenir pour éliminer les noms des colonnes ou pour séparer les colonnes avec des onglets. J'ai essayé avec header = F, ou col.names = F pour éliminer les en-têtes, et sep = "\ t" pour séparer les colonnes mais il ne reconnaît pas les commandes.

J'apprécierais toute aide. Merci, E.

Après toutes les suggestions, voici le code plus simple qui ferait l'affaire:

#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" 
     )) 

Merci à tous pour votre aide. E.

+2

check write.table - Votre approche l'enregistre de nouveau sous .csv ce qui n'est pas souhaitable dans votre cas. Pourriez-vous expliquer l'intention derrière cette division simplement utile en milliers de fichiers .txt jonchent votre disque? – Christian

+0

Merci Christian, j'ai essayé, mais ça me donne une erreur si j'utilise write.table au lieu de write.csv ... Ce sont des fichiers d'entrée pour un autre code générant des fichiers pour une entrée de modèle. Le code postérieur nécessite que ces fichiers soient dans un format très spécifique pour reconnaître l'information. – EBB

+0

Vous voudrez étudier l'erreur étant donné alors. 'write.csv' est un wrapper autour de' write.table', comme décrit par les docs ('? write.table'), et n'est pas conçu pour être aussi flexible. Dans mon expérience, il est presque toujours préférable d'utiliser 'write.table' et de spécifier manuellement les bons arguments nécessaires, plutôt que d'utiliser' write.csv' et j'espère que ses arguments sont ceux dont vous avez besoin. – user5359531

Répondre

1

J'ajusté votre code:

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

Ça marche! Merci!! pourquoi ne reconnaîtrait-il pas write.table avant? Maintenant, j'ai juste besoin de comprendre comment éliminer les noms de colonnes. Merci encore! – EBB

1

Essayez cette

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) 
} 

Sortie:

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

Merci encore. J'ai essayé de convertir en df, et cela fonctionne très bien pour des données limitées. Le problème est qu'avec plus de 9 000 lignes je me retrouve avec un code de 8 000 lignes ... J'essayais de trouver une solution plus simple ... – EBB

+0

Il me manquait une virgule pour l'argument col.names! C'est drôle. J'ai réalisé la révision de votre code, merci encore pour votre aide. – EBB

+0

"Le problème est qu'avec plus de 9 000 lignes, je me retrouve avec un code de 8 000 lignes." Vous ne savez pas ce que vous entendez par là, j'espère que vous n'insérez pas le contenu complet du fichier CSV dans votre script? Votre message original montre que vous lisez le fichier CSV directement dans un fichier df. Je ne sais pas quelles autres lignes de code vous avez besoin de plus. – user5359531

1

Cela peut fonctionner pour ce que vous essayez d'accomplir.

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

Merci Matt. J'ai essayé de convertir en df, et cela fonctionne très bien pour des données limitées. Le problème est qu'avec plus de 9 000 lignes je me retrouve avec un code de 8 000 lignes ... J'essayais de trouver une solution plus simple ... Dans tous les cas, je garderai votre code pour une utilisation ultérieure, merci encore! – EBB