2016-02-15 44 views
1

csv转储中的postgres数组看起来像大括号内的{1,2,3} 值。将csv转储中的postgres数组转换为向量

因此,有表CSV转储可能是这样的,

name  numbers 
----  ------- 
john  {1,2,3} 
me  {5,6} 

如何转换的数字列向量?

{1,2,3} -->c(1,2,3) 
{5,6} ->c(5,6} 
+0

'strsplit'可能会有所帮助在这里。 –

+0

看起来像一个错字吗? ' - > c(5,6}' –

+0

从R直接连接postgres可能更容易,启动本地pg实例,导入csv并从中读取所有数据可能更容易。保证从csv文件接收正确的数据集 –

回答

1

如果你只是想在垃圾堆里的字符串表示,在子查询中使用array_to_string()并连接所有的装饰:

COPY (SELECT name, 'c(' || array_to_string(numbers, ',') || ')' AS numbers 
     FROM tbl) TO '/path/to/target.sql'; 
+0

不错的一个。我也在寻找一个一般的方法在R读取一旦csv已经制定。 – joseph

1

通过注释字符设置为"-"阅读消除虚行的数据,删除括号并拆分给出列表的数字,将名称分配给每个列表组件,给出L并使用stack获取长表格。最后将其设置为数据框并将数字转换为数字。没有包被使用。

Lines <- "name  numbers 
----  ------- 
john  {1,2,3} 
me  {5,6}" 

DF <- read.table(text = Lines, header = TRUE, comment = "-", as.is = TRUE) 
L <- setNames(strsplit(gsub("[{}]", "", DF$numbers), ","), DF$name) 
with(stack(L), data.frame(name = ind, number = as.numeric(values))) 

,并提供:

name number 
1 john  1 
2 john  2 
3 john  3 
4 me  5 
5 me  6 

如果name列不应该是一个因素与替代的最后一行:

with(stack(L), 
data.frame(name = format(ind), number = as.numeric(values), stringsAsFactors = FALSE))