2013-04-26 140 views
1

您好,我正在合并从NSE Bhavcopy下载的csv。不同的日期有不同的cols。说26-12-2006它有998行& 27-12-2006它有1003行。它有8列。我做cbind创建一个&乙只有2色,符号,收盘价。我使用colnames命名col,以便合并我可以通过SYMBOL进行合并。合并多个csv在R

问题:

1)当我使用与由= “SYMBOL” 合并功能,所有= F;我很惊讶地看到结果c有1011行。在我读过的地方,与所有= F合并,它应该变成998行或最大1003行。我还分析了这些数据,发现在26-12-2006中有3种不同的符号在27-12-2006 &中有5个不同的符号。所以当我们通过“SYMBOL”合并时,两个行中的新符号会被添加?或者它只会与先前存在的行合并?

2)NSEmerg是一个函数,它使用for循环读取新文件,每次&与现有的c文件合并。我有大约1535个文件,其数据来自2006年12月至2013年4月。但是我无法合并超过12个文件,因为它引发错误向量大小为12 MB,因此无法允许。它还显示警告消息,说1535 MB的内存分配用完了。同样在第12个文件中,我发现c的nrow是1508095,意味着无限循环运行。在所有的1535份文件中,最高排在1435.即使我们加入所有已退市的股票,没有在特定日期交易,我相信它可能不会跨越2200个股票。为什么这显示150万的黑暗?

3)有什么更好的方式合并csv?我第一次在堆栈溢出,我会附加说10个文件。

代码:

a <- read.csv("C://Users/home/desktop/061226.csv", stringsAsFactors = F, header = T) 
b <- read.csv("C://Users/home/desktop/061227.csv", stringsAsFactors = F, header = T) 
a_date <- a[2,1] 
b_date <- b[2,1] 
a <- cbind(a[,2],a[,6]) 
b <- cbind(b[,2], b[,6]) 
colnames(a) <- c("SYMBOL", a_date) 
colnames(b) <- c("SYMBOL", b_date) 
c <- merge(a,b,by = "SYMBOL", all = F) 

NSEmerg <- function(x,y) { 
    y_date <- y[2,1] 
    y <- cbind(y[,2], y[,6]) 
    colnames(y) <- c("SYMBOL", y_date) 
    c <- merge(c, y, by = "SYMBOL", all = F) 
    } 

filenames = list.files(path = "C:/Users/home/Documents/Rest data", pattern = "*csv") 

for (i in 1:length(filenames)){ 
    y <- read.csv(filenames[i], header = T, stringsAsFactors = F) 
    c <- NSEmerg(c,y) 
    } 

write.csv(c, file = "NSE.csv") 

回答

-1

你可能会更好只使用一个Perl一行代码:

perl -pe1 file1 file2 file3 ... > newfile 

,然后你可以砍你需要出

cut -f1,2 -d"," newfile > result 
+0

我对PERL没有任何线索,早些时候当我粘贴引用它抛出错误说PERL不可用;你能给我准确的语法吗?说我有文件130425.csv,130423.csv,130422.csv;如何用3个文件在perl中创建一个新文件?所有这3个文件只在工作目录中。当我输入你的代码时,它给我一个错误,说perl -pe1 130425中出现意外的数字常量。对不起,我对编码非常陌生&R – planetpb 2013-04-26 20:49:29

1

您确定要cbind而不是rbind?回答你最后的问题。首先,你列出所有的.csv文件在你的地图:

listfiles <- list.files(path="C:/Users/home/desktop", pattern='\\.csv$', full.names=TRUE) 

下一页使用do.call在不同的CSV文件阅读和rbind将它们结合起来。

df <- do.call(rbind, lapply(listfiles , read.csv)) 
+2

'pattern'参数是一个正则表达式,所以你应该跳过这段时间,否则它意味着任何角色。如果你想要全面证明,你应该添加一个$来表示字符串结尾,例如'pattern ='\\。csv $''。 – 2013-04-26 21:50:31

+0

谢谢你的改进。我更新了答案。 – JT85 2013-04-27 09:07:19