windows - Tilføj et komma til csv filer, i R eller batch/cmd

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har nogle csv-filer, men problemet er, at efter første linie mangler et komma. Ved du, hvordan jeg kunne tilføje et komma med batch/cmd eller med R efter første linie?


Så formoder, at jeg har:



  var1, var2, var3, VAR4, Var5

  
  a, b, c, d, e,

  
  f, g, h, i, j,

  
  ...



Og jeg vil gerne gøre det



  var1, var2, var3, VAR4, Var5,

  
  a, b, c, d, e,

  
  f, g, h, i, j,

  
  ...



Alle løsninger er gode, men jeg kan kun bruge batch eller R. [[Den første linje kan ændre sig i længde og syntaks]]


Rediger: Jeg angiver, at problemet er ved at redigere 20 GB filer, og jeg leder efter den hurtigste måde, der bringer resultatet.


Tak

Bedste reference


Tilføjelse af blot en , til slutningen af ​​hver linje kan ske i en R one-liner:


cat(paste(readLines("input.csv"), ",", sep = ""), file = "output.csv", sep = "
")


forklaret:



  • readLines læser hver linje i din input.csv fil (som element i en tegnvektor)

  • paste(..., ",", sep = "") tilføjer et komma til hver linje

  • cat(..., file = "output.csv", sep = " ") skriver linjerne til den nye output.csv fil (i Windows skal linjestykket " " muligvis justeres).


Andre referencer 1


@ECHO OFF
SETLOCAL
SET "sourcedir=U:sourcedir"
SET "destdir=U:destdir"
SET "filename1=\%sourcedir\%q42057779.txt"
SET "outfile=\%destdir\%outfile.txt"
SET first=y
(
FOR /f "usebackqdelims=" \%\%a IN ("\%filename1\%") DO (
 IF DEFINED first (ECHO \%\%a,) ELSE (ECHO \%\%a)
 SET "first="
)
)>"\%outfile\%"

GOTO :EOF


Du skal ændre indstillingerne for sourcedir og destdir, så de passer til dine forhold.


Jeg brugte en fil med navnet q42057779.txt, der indeholder dine data til min testning.


Indstil et flag first til enhver værdi (værdien er irrelevant)


Læs hver linje i inputfilen. Hvis flaget er defineret, udsender du linjen med en terminal , ellers, reproducer bare linjen. Derefter set flag til intet , så det er udefineret og dermed resten af ​​filen gengives uden ændring.

Andre referencer 2


Et par svar på dette:



  1. Hvis du har en headerrække mangler et felt, er det noget problematisk. De fleste værktøjer antager enten (a) overskriftsrad har alle kolonner, eller (b) der er ingen overskriftsrække. Uanset hvad der produceres, skal denne fil være 'fast', men det er en anden diskussion.

  2. Du kan løse dette, når du indlæser dataene, og holder de originale filer uberørt.


    cn <- read.csv("file2.csv", nrows = 1, header = FALSE, stringsAsFactors = FALSE)
    dat <- read.csv("file2.csv", skip = 1, header = FALSE)
    colnames(dat)[seq\_along(cn)] <- cn
    dat
    #   var1 var2 var3 var4 var5 NA
    # 1    a    b    c    d    e NA
    # 2    f    g    h    i    j NA
    


    Denne procedure skal udføres hver gang du indlæser denne kode. Fordelen ved at bruge denne metode er bedre, når filen er stor, og du vil ikke have de ekstra filer (størrelse eller nummer). Det kan stadig være uesd på filer, der ikke beviser dette symptom.

  3. Du kan 'rette' filen.


    x <- readLines("file.csv")
    x[1] <- paste0(x[1], ",")
    writeLines(x, "file2.csv")
    read.csv("file2.csv")
    #   var1 var2 var3 var4 var5  X
    # 1    a    b    c    d    e NA
    # 2    f    g    h    i    j NA
    


    Ulempen ved dette er, at den læser hele filen i hukommelsen; sandsynligvis ikke et problem afhængigt af filstørrelsen, men lidt ineffektiv. Fordelen er, at når du er 'fast', kan du flytte den 'forkerte' fil ud af vejen og kun beskæftige sig med den 'rigtige' fil.



Med begge løsninger 2 og 3 skal du tildele det tilsigtede kolonnenavn.