2017-01-12 4 views
2

Ich habe eine CSV-Datei mit 6 Spalten und eine der Spalten hat Text getrennt durch Komma, z. B. BOLT, RD HD SQ kurzen Hals, METRIC.Lesen einer CSV-Datei mit Kommas in einer Spalte

Wenn ich diese Datei in R lese, gibt es einen Überlauf aus dieser Spalte und die Daten werden anschließend in eine neue Zeile verschoben.

Im Folgenden werde ich einige Zeilen

014003051906, ETN5080, 0450, BOLT KIT obere Welle mit 5 Gang, 1.000, F 014003051906, ETN5967, 0460, SENSOR SENSOR FH BACKSHAFT SPEED, 1.000, F am Einfügen 014003051906, ETN64267, 0470, Kippeinheit SENSOR, 1.000, F

014003065376,03M7184, 0020, BOLT - M 8,0 X X 1,250 20,0 - 8,8-Zink, 4,000, G 014003065376,03M7386, 0090, BOLT, RD HD SQ KURZER HALS, METRISCH, 18.000, G 014003065376,14M7296, 0090, NUSS, METRISCH, HEX FLANSCH, 14.000, G

Die letzten zwei Zeile ist, wo das Problem liegt. "NUT, METRIC, HEX FLANGE" sollte unter eine Variable fallen.

Wie kann das gelöst werden?

+4

Wie sind Sie auf die Daten gestoßen? (gespeichert als CSV aus Excel?) Die beste Lösung besteht darin, die Daten in einem Format zu speichern, in dem entweder die Daten zitiert werden oder ein anderes Trennzeichen verwendet wird. – Benjamin

+0

@Benjamin Ich hatte das gleiche gedacht. Aber leider ist dies die einzige Quelle, die wir haben. – darkage

+0

Sie könnten mit regulären Ausdrücken gehen –

Antwort

8
data <- readLines(con = textConnection("014003051906,ETN5080 ,0450,BOLT KIT UPPER SHAFT WITH 5 SPEED,1.000,F 
014003051906,ETN5967 ,0460,SENSOR SENSOR FH BACKSHAFT SPEED,1.000,F 
014003051906,ETN64267 ,0470,TILT UNIT SENSOR,1.000,F 

014003065376,03M7184 ,0020,BOLT - M 8.0 X 1.250 X 20.0 - 8.8-Zinc,4.000,G 
014003065376,03M7386 ,0090,BOLT, RD HD SQ SHORT NECK, METRIC,18.000,G 
014003065376,14M7296 ,0090,NUT, METRIC, HEX FLANGE,14.000,G")) 

pattern <- "^([^,]*),([^,]*),([^,]*),(.*),([^,]*),([^,]*)$" 

library(stringr) 
str_match(data, pattern)[, - 1] 
#  [,1]   [,2]  [,3] [,4]          [,5]  [,6] 
# [1,] "014003051906" "ETN5080 " "0450" "BOLT KIT UPPER SHAFT WITH 5 SPEED"  "1.000" "F" 
# [2,] "014003051906" "ETN5967 " "0460" "SENSOR SENSOR FH BACKSHAFT SPEED"  "1.000" "F" 
# [3,] "014003051906" "ETN64267 " "0470" "TILT UNIT SENSOR"      "1.000" "F" 
# [4,] NA    NA   NA  NA          NA  NA 
# [5,] "014003065376" "03M7184 " "0020" "BOLT - M 8.0 X 1.250 X 20.0 - 8.8-Zinc" "4.000" "G" 
# [6,] "014003065376" "03M7386 " "0090" "BOLT, RD HD SQ SHORT NECK, METRIC"  "18.000" "G" 
# [7,] "014003065376" "14M7296 " "0090" "NUT, METRIC, HEX FLANGE"    "14.000" "G" 

Edit:
Regex Erklärungen für Anfänger, in einfachen Worten, so wenden Sie sich bitte verzeihen Ungenauigkeiten:

  • Initial ^ und Terminal $ bedeuten Beginn und Ende der Zeichenfolge.
  • Parens sind für die Gruppierung (Gruppen, die str_match() extrahiert wird).
  • . bedeutet jedes Zeichen, und .* bedeutet eine beliebige Anzahl von Zeichen.
  • [^,] bedeutet jedes Zeichen, das kein Komma ist.

wenn zusammen, es bedeutet: start of string - substring without a comma - comma (3 mal wiederholt) - substring possibly containing commas - comma - substring without a comma - comma - substring without a comma - end of string, und nur die eingeklammerten Gruppen werden extrahiert.

+1

Erweitern Sie Ihre Idee, Sie könnten Kommas um das vierte Feld hinzufügen und 'read.csv' aufrufen:' read.csv (text = gsub ("^ ([^,] *, [^,] *, [^,] * ,) (. *) (, [^,] *, [^,] *) $ "," \\ 1 \ "\\ 2 \" \\ 3 ", Daten), header = FALSE)' – nicola

+1

@Apom Ich bin neu in Regex, kannst du bitte den Regex-Teil erklären? – darkage

+0

@darkage Siehe meine Bearbeitung –

Verwandte Themen