Groovy在Grails插件的CSVWriter中使用自己的引号字符

时间:2015-07-16 08:45:53

标签: csv groovy

我想使用Grails插件中的CSVWriter,但我不知道如何更改默认引号和值分隔符。我也想知道如何避免标题行。

我的代码(无效)

Writer writer = new StringWriter()
CSVWriter w = new CSVWriter(writer, {
    testdata.eachWithIndex { row, index ->
        "${row}" {it."${row}"}
    }
})
w.quote = "'"
w.valueSeperator = ";"

w.quote无效

2 个答案:

答案 0 :(得分:2)

Here是Grails CVS插件的源代码。在我看来,与CSVReader 相反,CSVWriter在构造函数选项中不接受覆盖分隔符等。

CSVWriter(Writer writer, Closure definition)

<强>更新

正如评论中暗示的那样,我试图改变子类中的引号字符。这很有效,但不幸的是标题行存在问题(包含两个** null *字符串)。我无法解决这个问题。

import org.grails.plugins.csv.CSVWriter 
  /* Groovy Version: 2.4.4 */
@groovy.transform.InheritConstructors
class MyCSVWriter extends CSVWriter {

  private columns = [:]
    private cachedQuote
  private cachedQuoteEscape
  private cachedQuoteReplace
  private cachedValueSeperator
  private cachedRowSeperator
  private producers
  private lastProducer
  private headingsWritten = false  


  protected getQuote() {
  "'"
  }

  protected getQuoteEscape() {
  "'"
  }

  protected getValueSeperator() {
  ","
  }
  protected getRowSeperator() {
  "\n"
  }

}

def sw = new StringWriter()
def b = new MyCSVWriter(sw, {
  col1 { it.val1 }
  col2 { it.val2 }
})

b << [val1: 'a', val2: 'b']
b << [val1: 'c', val2: 'd']

println  b.writer.toString()


'col1'null'col2'null
'a','b'
'c','d'

答案 1 :(得分:0)

我不知道你是否解决了这个问题,但我遇到了同样的问题,我已经能够改变,例如valueSeperator设置属性的值{{1} }。所以在你的例子中,你可以这样做:

cachedValueSeperator

我希望这可以提供帮助。