2016-06-16 24 views
5

Czytam dane z pliku .csv przy użyciu data.table::fread na komputerze z systemem Windows 10. Dane są prawidłowo wczytane poprzez read.csv; jednak gdy używam fread do odczytu danych, wszystkie końcowe kolumny w każdym wierszu wynikowej tabeli danych kończą się \r, prawdopodobnie wskazując powrót karetki. Powoduje to, że pola numeryczne mają typ danych znakowych. (Zamiast literału numerycznego 4.53, komórka kończąca wiersz będzie zawierała literał znaków 4.53\r.)Dlaczego funkcja wstawiania znaków powrotu karetki ( r) do pliku data.table?

Dlaczego ten błąd występuje? Czy istnieje sposób, aby rozwiązać to bezpośrednio przez wywołanie funkcji fread?

Aktualizacja

uzyskać następujące gdy parametr verbose = TRUE służy

Input contains no \n. Taking this to be a filename to open 
File opened, filesize is 0.000001 GB. 
Memory mapping ... ok 
Detected eol as \n only (no \r afterwards), the UNIX and Mac standard. 
Positioned on line 1 after skip or autostart 
This line is the autostart and not blank so searching up for the last non-blank ... line 1 
Detecting sep ... ',' 
Detected 7 columns. Longest stretch was from line 1 to line 13 
Starting data input on line 1 (either column names or first row of data). First 10 characters: subjectNum 
All the fields on line 1 are character fields. Treating as the column names. 
Count of eol: 13 (including 1 at the end) 
Count of sep: 72 
nrow = MIN(nsep [72]/ncol [7] -1, neol [13] - nblank [1]) = 12 
Type codes ( first 5 rows): 1131414 
Type codes: 1131414 (after applying colClasses and integer64) 
Type codes: 1131414 (after applying drop or select (if supplied) 
Allocating 7 column slots (7 - 0 dropped) 
Read 12 rows. Exactly what was estimated and allocated up front 
    0.000s ( 0%) Memory map (rerun may be quicker) 
    0.001s (33%) sep and header detection 
    0.000s ( 0%) Count rows (wc -l) 
    0.002s (67%) Column type detection (first, middle and last 5 rows) 
    0.000s ( 0%) Allocation of 12x7 result (xMB) in RAM 
    0.000s ( 0%) Reading data 
    0.000s ( 0%) Allocation for type bumps (if any), including gc time if triggered 
    0.000s ( 0%) Coercing data already read in type bumps (if any) 
    0.000s ( 0%) Changing na.strings to NA 
    0.003s  Total 
+0

Możesz spróbować stworzyć powtarzalny przykład, np. 'Fread (" a \ n1 \ r \ n2 \ r \ n ")" może "? W tym przypadku wskaźniki końca linii są niespójne, co prowadzi do widocznego zachowania. – Frank

+0

To rzeczywiście prowadzi do błędu w R. Kiedy czytam plik w Notepad ++, plik ma tylko LF w pierwszym wierszu i CR LF (\ r \ n) w kolejnych wierszach. Prosimy o przesłanie odpowiedzi, abym mógł przyjąć Twoją odpowiedź. – Bob

+0

Czy wiesz, czy jest to częste zdarzenie z plikami .csv? – Bob

Odpowiedz

6

Jeśli masz plik, który wygląda jak x="a\n1\r\n2\r\n", następnie fread(x) dadzą wynik opisany sposób:

 a 
1: 1\r 
2: 2\r 

Dzieje się tak, ponieważ wskaźniki końca linii są niespójne w poprzek linii.

Słyszałem o tym, co się dzieje z innymi, ale nie jestem pewien, skąd pochodzi i czy jest lepszy sposób rozwiązania problemu niż "naprawienie" pliku, prawdopodobnie za pomocą narzędzia wiersza poleceń.

+0

Myślę, że widziałem kogoś z tym problemem na liście mailingowej lub github, ale nie mogę znaleźć linku. – Frank

+1

Zdarzyło mi się, gdy utworzyłem dane za pomocą Pythona, zakodowałem nagłówek za pomocą '\ n' w Windows. [python os.linesep] (http://stackoverflow.com/questions/1223289) – user3226167