2011-05-02 110 views
3

我有一个问题确实措辞这个问题,所以我尝试举个例子:如何在制表符分隔符来自数据库时编写制表符分隔的文件?

下面的代码工作,并创建预期输出:一个分隔的文件,其中每列由一个“真正的”制表符分隔。

CSV.open(@targetfile, "wb", "\t") { |csv| 
csv << ["row", "of", "CSV", " } 

以下代码不会产生预期结果。

CSV.open(@targetfile, "wb", @targetdelimiter) { |csv| 
csv << ["row", "of", "CSV", "data"] } 

@targetdelimiter在这种情况下来自于数据库,实际上是字符串'\t'(没有引号),它可以由用户来配置。

此代码还会生成一个分隔的输出,但我可以看到'\t'而不是“真实”制表符。

如何使用第二个代码块获得与第一个代码块相同的结果?从数据库中输入@targetdelimiter='\t'

+1

你真的在这里问的是如何将'\ t'变成“\ t”。这是一个非常有趣的问题,我不能马上想到答案。 – regularfry 2011-05-02 20:43:43

回答

7

只是gsub它,并与它做。

CSV.open(@targetfile, "wb", @targetdelimiter.gsub('\t',"\t")){ |csv| 
csv << ["row", "of", "CSV", "data"] } 
+1

描述中缺少的重要因素是@targetdelimiter可能采用的其他值。我假设有一个有效值的范围,否则像这样的微不足道的方法显然是正确的。 – regularfry 2011-05-03 07:33:19

+0

这可以和通常的嫌疑人一起工作',',';','','|'呃,'/ t'。 – steenslag 2011-05-05 22:59:00

+0

是的,但你需要在gsub调用中的特定条目来处理它们。 – regularfry 2011-05-08 09:38:01

1

\t由实际制表符(ASCII 0x09,或Char(9))时,它的使用在第一示例的分隔符替换。第二,它不被替换,它被用作文字字符序列\t。如果您没有用户存储转义序列,则可能有运气,而是使用类似TABNEWLINE的东西,然后您可以从数据库中读取并转换为正确的字符(或者您可以将它们从文字到正确的字符)。

相关问题