当一些字符串变量嵌入新行时导出和导入数据

时间:2015-02-04 15:32:53

标签: r csv sas dbf

假设我有这个代码的变量s:

s <- "foo\nbar"

然后将其更改为data.frame

s2 <- data.frame(s)

现在s2是一个带有一条记录的data.frame,然后我导出到一个csv文件:

write.csv(s2, file = "out.csv", row.names = F)

然后我用记事本打开它,“foo \ nbar”被分成两行。使用SAS导入:

proc import datafile = "out.csv" out = out dbms = csv replace;
run;

我有两条记录,一条是''foo',另一条是'bar'',这是不可取的。

经过一段时间的努力之后,我发现如果我从R出口这样的外国包裹:

write.dbf(s2, 'out.dbf')

然后用SAS导入:

proc import datafile = "out.dbf" out = out dbms = dbf replace;
run;

一切都很好,在sas中有一条记录,价值似乎是'foo bar'。 与dbf相比,这是否意味着在处理数据时csv是一个糟糕的选择?对此还有其他解决方案或解释吗?

3 个答案:

答案 0 :(得分:0)

CSV文件代表逗号分隔版本。这意味着文件中的每一行都应包含由逗号分隔的值列表。 SAS根据CSV文件的定义正确导入文件(即2行= 2行)。

您遇到的问题是由字符串中的\n字符引起的。这个字符序列碰巧代表换行符,这就是R write.csv()调用创建两行而不是全部放在一行上的原因。

我不是R的专家,所以我无法告诉您如何修改对write.csv()的调用或屏蔽输入字符串中的\n值以防止它从写出换行符。

你没有.dbf这个问题的原因可能是因为它并不关心逗号或换行符来指示新变量或行何时开始,它必须具有它自己的特殊性表示这一点的字节序列。

答案 1 :(得分:0)

DBF - 是一种数据库格式,它总是更容易使用,因为它们的结构中嵌入了可变类型/长度。

使用CSV或任何其他分隔文件,您必须包含文档才能知道文件结构。

CSV的优势在于较小的文件大小以及跨多个操作系统和应用程序的兼容性。有一段时间Excel(2007?)不再支持DBF。

答案 2 :(得分:0)

正如罗伯特所说,你需要掩盖新的线值。例如:

replace_linebreak <- function(x,...){
  gsub('\n','|n',x)
}   

s3 <- replace_linebreak(s2$s)

这会将\n替换为|n,您再次导入时需要替换它。显然,您选择使用它来掩盖它将取决于您的数据。