2013-04-12 98 views
10

我有予讀取使用下面的函數csv文件:跳過read.csv某些行中的R

csvData <- read.csv(file="pf.csv", colClasses=c(NA, NA,"NULL",NA,"NULL",NA,"NULL","NULL","NULL")) 
dimnames(csvData)[[2]]<- c("portfolio", "date", "ticker", "quantity") 

它讀取從該文件中的所有行。但我想從閱讀中跳過一些行。如果ticker列的值爲:ABTADCT,則該行不應讀取。可能嗎?我的csv文件的

示例如下:

RUS1000,01/29/1999,21st Centy Ins Group,TW.Z,90130N10,72096,1527.534,0.01,21.188 
RUS1000,01/29/1999,3com Corp,COMS,88553510,358764,16861.908,0.16,47.000 
RUS1000,01/29/1999,3m Co,MMM,88579Y10,401346,31154.482,0.29,77.625 
RUS1000,01/29/1999,A D C Telecommunicat,ADCT,00088630,135114,5379.226,0.05,39.813 
RUS1000,01/29/1999,Abbott Labs,ABT,00282410,1517621,70474.523,0.66,46.438 
RUS1000,02/26/1999,21st Centy Ins Group,TW.Z,90130N10,72096,1378.836,0.01,19.125 
RUS1000,02/26/1999,3com Corp,COMS,88553510,358764,11278.644,0.11,31.438 
RUS1000,02/26/1999,3m Co,MMM,88579Y10,402146,29783.938,0.29,74.063 
+3

使用'readLines'和使用正則表達式過濾掉不良行。 –

+1

爲什麼不在以後讀整個文件和子集? – A5C1D2H2I1M1N2O1R2T1

+0

實際上文件有200mb +,大部分數據都包含這些值。 –

回答

18

有可能使用sqldf package,使用read.csv.sql

讓說的sample.csv的內容是這樣的:

id,name,age 
1,"a",23 
2,"b",24 
3,"c",23 

我們只讀行,其中年齡= 23:

require(sqldf) 

df <- read.csv.sql("sample.csv", "select * from file where age=23") 

df 
    id name age 
1 1 "a" 23 
2 3 "c" 23 

可以選擇必要的列:

df <- read.csv.sql("sample.csv", "select id, name from file where age=23") 
df 
    id name 
1 1 "a" 
2 3 "c" 
+1

你能否詳細說明答案?那麼它將更有可能幫助你的答案獲得關注。 –

+0

我已經用一個簡單的,自包含的示例更新了我的答案。 – Nishanth

+2

+1以獲得詳細答案; –

1

這是更好地閱讀所有與子集以後類似建議的評論:

csvData [!csvData$ticker %in% c('ADCT','ABT'),] 

編輯

你可以使用來自data.table包,以更高效地讀取文件。

library(read.table) 
fread(file="pf.csv") 
+4

假設文件太大而無法讀入內存,那麼OP的選擇是什麼呢? –

+2

實際上有200mb +的文件和大多數數據包含這些值。所以我認爲這是不高效的。 –

0

對我來說,sqldf包的read.csv.sql在第一次臉紅時看起來很棒。但是當我嘗試使用它時,它沒有處理「NULL」字符串。 (其他人也發現了這一點。)不幸的是,它不支持所有的read.csv特性。 所以我不得不寫我自己的。我很驚訝,沒有一個好的包裝。

fetchLines=function(inputFile,match,fixed=T,n=100,maxlines=100000){ #inputFile='simple.csv'; match='APPLE'; 
    message('reading:',inputFile) 
    n=min(n,maxlines) 
    con <- base::file(inputFile, open = "r",encoding = "UTF-8-BOM") 
    data=c(readLines(con, n = 1, warn = FALSE)) 
    while (length(oneLine <- readLines(con, n = n, warn = FALSE)) > 0) { 
    grab=grep(match,oneLine,value=T,fixed=fixed) 
    if(length(grab)>0){ 
     data=c(data,grab) 
     if(length(data)>maxlines){ 
     warning("bailing out too many"); 
     return(data); 
     } 
     cat('.') 
    } 
    } 
    close(con) 
    gc() 
    cat("\n") 
    data; 
} 

#To avoid: argument 'object' must deparse to a single character string 
fdata=textConnection(fetchLines("datafile.csv",'\\bP58\\b',fixed=F,maxlines = 100000)) 
df<-read.csv(fdata,header=T,sep=",",na.strings = c('NULL',''),fileEncoding = "UTF-8-BOM",stringsAsFactors = F) 

R textConnection: "argument 'object' must deparse to a single character string"

+0

'read.csv.sql'基於SQLite工具,而不是'read.table',所以人們無法真正期望它的工作原理完全相同;然而,'read.csv.sql'的'filter ='和'sql ='參數可以用於任意的預處理,所以根據你的數據看起來像通常可以處理任意缺失值的情況。例如,'filter =「sed -e s/NULL // g」'將刪除所有出現的字符串NULL。 (在Windows上,它會假設你已經安裝了Rtools並從那裏獲得sed。) –

+0

我嘗試用空字符串交換NULL,但它不被解釋爲NA。你的絕招AFAIK不會將它視爲NA。 – Chris

+0

如果它是一個數字字段,那麼它們將被視爲0,並且您可以在R端替換它們。或者用-99替換NULL,比方說,將它們替換爲R端。 –