Je suis un urbaniste migrant vers l'analyse de données spatiales. Je ne suis pas inconscient de R et de la programmation en général mais comme je n'ai pas la formation adéquate, mes compétences sont parfois limitées.Importer des fichiers CSV avec des lignes brisées CRLF dans R
En ce moment j'essaie d'analyser environ 50 fichiers CSV contenant des données financières concernant des ventes aux enchères publiques qui sont de 60000 à 300000 lignes avec 39 champs. Les fichiers sont des exportations du système national d'enchères publiques roumain, qui est une plate-forme de type formulaire.
Le problème est que certaines des lignes sont brisées par CRLF
terminaisons de ligne au milieu des champs d'adresse. Je soupçonne que lorsque les gens ont entré leur adresse dans le formulaire, ils l'ont copié/collé à partir d'autres fichiers où il était multiligne.
Le problème ne peut pas être résolu par Rechercher & Remplacer car cela remplacera également le bon CRLF
à la fin de la ligne.
À titre d'exemple les données sont formatées quelque chose comme ça et a un CRLF
après chaque ligne (Ils ont utilisé^comme séparateur):
Castigator^CastigatorCUI^CastigatorTara^CastigatorLocalitate^CastigatorAdresa^Tip^TipContract^TipProcedura^AutoritateContractanta^AutoritateContractantaCUI^TipAC^TipActivitateAC^NumarAnuntAtribuire^DataAnuntAtribuire^TipIncheiereContract^TipCriteriiAtribuire^CuLicitatieElectronica^NumarOfertePrimite^Subcontractat^NumarContract^DataContract^TitluContract^Valoare^Moneda^ValoareRON^ValoareEUR^CPVCodeID^CPVCode^NumarAnuntParticipare^DataAnuntParticipare^ValoareEstimataParticipare^MonedaValoareEstimataParticipare^FonduriComunitare^TipFinantare^TipLegislatieID^FondEuropean^ContractPeriodic^DepoziteGarantii^ModalitatiFinantare
S.C. RCTHIA CO S.R.L.^65265644^Romania^Bucharest^DN1
Nr. 1, ^Anunt de atribuire la anunt de participare^Furnizare^Licitatie deschisa^COMPANIA NATIONALA DE TRANSPORT AL ENERGIEI ^R656556^^Electricitate^96594^2007-12-14^Un contract de achizitii publice^Pretul cel mai scazut^^1^^61^2007-11-08 00:00:00.000^Televizoare^304503.95^RON^304503.950000000001^89650.5^45937^323124100-1^344578^2007-10-02^49700.00^RON^^^^^^Nu este cazul;^Surse proprii;
ASOC : SC MNG SRLsi SC AquaiM SA ^56565575;656224^Romania^Ploiesti^Str. Independentei nr.15;
Str. Carol nr. 45^Anunt de atribuire la anunt de participare^Lucrari^Negociere fara anunt de participare^MUNICIPIUL RAMNICU VALCEA^6562655^Administratie publica locala (municipii, orase, comune), institutie publica in subordonarea/coordonarea administratiei publice locale^Servicii generale ale administratiilor publice^56566^2007-10-10^Un contract de achizitii publice^Pretul cel mai scazut^^1^^65656^2007-09-12^Proiectare si executie lucrari^5665560.00^RON^659966.0^5455222^7140^65689966-2^^^^^^^^^^^
Afin de traiter correctement les données que je aurais besoin du CSV être lu comme celui-ci, en supprimant seulement les CRLF
qui brisent les lignes - qui trouvent & Remplacer ne peut pas faire:
Castigator^CastigatorCUI^CastigatorTara^CastigatorLocalitate^CastigatorAdresa^Tip^TipContract^TipProcedura^AutoritateContractanta^AutoritateContractantaCUI^TipAC^TipActivitateAC^NumarAnuntAtribuire^DataAnuntAtribuire^TipIncheiereContract^TipCriteriiAtribuire^CuLicitatieElectronica^NumarOfertePrimite^Subcontractat^NumarContract^DataContract^TitluContract^Valoare^Moneda^ValoareRON^ValoareEUR^CPVCodeID^CPVCode^NumarAnuntParticipare^DataAnuntParticipare^ValoareEstimataParticipare^MonedaValoareEstimataParticipare^FonduriComunitare^TipFinantare^TipLegislatieID^FondEuropean^ContractPeriodic^DepoziteGarantii^ModalitatiFinantare
S.C. RCTHIA CO S.R.L.^65265644^Romania^Bucharest^DN1 Nr. 1, ^Anunt de atribuire la anunt de participare^Furnizare^Licitatie deschisa^COMPANIA NATIONALA DE TRANSPORT AL ENERGIEI ^R656556^^Electricitate^96594^2007-12-14^Un contract de achizitii publice^Pretul cel mai scazut^^1^^61^2007-11-08 00:00:00.000^Televizoare^304503.95^RON^304503.950000000001^89650.5^45937^323124100-1^344578^2007-10-02^49700.00^RON^^^^^^Nu este cazul;^Surse proprii;
ASOC : SC MNG SRLsi SC AquaiM SA ^56565575;656224^Romania^Ploiesti^Str. Independentei nr.15; Str. Carol nr. 45^Anunt de atribuire la anunt de participare^Lucrari^Negociere fara anunt de participare^MUNICIPIUL RAMNICU VALCEA^6562655^Administratie publica locala (municipii, orase, comune), institutie publica in subordonarea/coordonarea administratiei publice locale^Servicii generale ale administratiilor publice^56566^2007-10-10^Un contract de achizitii publice^Pretul cel mai scazut^^1^^65656^2007-09-12^Proiectare si executie lucrari^5665560.00^RON^659966.0^5455222^7140^65689966-2^^^^^^^^^^^
J'ai trouvé une solution possible (Is there a way in R to join broken lines of csv file?), mais il a fallu un peu tweakin g pour répondre à mes besoins. Le résultat final est que le code ci-dessous se bloque et n'atteint pas la fin du processus, même sur de petits fichiers d'échantillons.
Mon altération du code de solution retenue du poste mentionné ci-dessus:
dat <- readLines("filename.csv") # read whatever is in there, one line at a time
varnames <- unlist(strsplit(dat[1], "^", fixed = TRUE)) # extract variable names
nvar <- length(varnames)
k <- 1 # setting up a counter
dat1 <- matrix(NA, ncol = nvar, dimnames = list(NULL, varnames))
while(k <= length(dat)){
k <- k + 1
if(dat[k] == "") {k <- k + 1
print(paste("data line", k, "is an empty string"))
if(k > length(dat)) {break}
}
temp <- dat[k]
# checks if there are enough commas or if the line was broken
while(length(gregexpr("^", temp)[[1]]) < nvar-1){
k <- k + 1
temp <- paste0(temp, dat[k])
}
temp <- unlist(strsplit(temp, "^"))
message(k)
dat1 <- rbind(dat1, temp)
}
dat1 = dat1[-1,] # delete the empty initial row
comptage des champs entre délimiteurs semble être une bonne solution, mais je suis incapable de trouver une bonne façon de le faire et mes compétences en programmation R ne sont pas assez apparemment.
Y a-t-il un moyen de réparer ce type de fichiers CSV cassés dans R?
exemples de fichiers de travail peuvent être consultés ici: http://data.gv.ro/dataset/4a4903c4-b1e3-46d1-82a5-238287f9496c/resource/c6abc0ef-3efb-4aef-bc0a-411f8cab2a28/download/contracte-2007.csv
Merci pour toute aide que vous pouvez donner!
Salut Michael, merci pour votre réponse. La solution que vous avez publiée ne fonctionne pas pour moi. J'ai mis à jour l'échantillon de données pour refléter les données réelles. Pourriez-vous faire un test rapide pour voir si le problème est peut-être sur ma machine? Cela serait très appréciable! – AFG
Le code que vous avez suggéré ne sépare pas les en-têtes de mes données d'échantillon par le délimiteur "^". – AFG
Vous avez raison, le fixed = true ne devrait pas être là. Voir le code fixe ci-dessus et la sortie. –