/tst/org/diffkit/util/tst/CSVDataGenerator.groovy

http://diffkit.googlecode.com/ · Groovy · 122 lines · 87 code · 16 blank · 19 comment · 1 complexity · af6ce2c6ff36fdef84bb4ea8979ddff7 MD5 · raw file

  1. /**
  2. * Copyright 2010-2011 Joseph Panico
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package org.diffkit.util.tst
  17. import org.apache.commons.lang.RandomStringUtils;
  18. /**
  19. * @author jpanico
  20. */
  21. public class CSVDataGenerator {
  22. enum FieldType {
  23. STRING, INTEGER, DECIMAL
  24. }
  25. private static CSVDataGenerator _instance = new CSVDataGenerator()
  26. public static void main(String[] args_){
  27. _instance.generate()
  28. }
  29. private void generate(){
  30. def rowSpecifier = [
  31. new FieldSpecifier(FieldType.INTEGER,10),
  32. new FieldSpecifier(FieldType.INTEGER,5),
  33. new FieldSpecifier(FieldType.INTEGER,5),
  34. new FieldSpecifier(FieldType.INTEGER,3),
  35. new FieldSpecifier(FieldType.INTEGER,1),
  36. new FieldSpecifier(FieldType.DECIMAL,6,2)
  37. ]
  38. def rows = this.writeRows( rowSpecifier, '|', 100, new File("data.csv").newWriter())
  39. }
  40. private void generate1(){
  41. def rowSpecifier = [
  42. new FieldSpecifier(FieldType.STRING,10),
  43. new FieldSpecifier(FieldType.INTEGER,10),
  44. new FieldSpecifier(FieldType.DECIMAL,10,3),
  45. new FieldSpecifier(FieldType.DECIMAL,10,3),
  46. new FieldSpecifier(FieldType.STRING,10),
  47. new FieldSpecifier(FieldType.INTEGER,10),
  48. new FieldSpecifier(FieldType.DECIMAL,10,3),
  49. new FieldSpecifier(FieldType.DECIMAL,10,3),
  50. new FieldSpecifier(FieldType.STRING,10),
  51. new FieldSpecifier(FieldType.INTEGER,10),
  52. new FieldSpecifier(FieldType.DECIMAL,10,3),
  53. new FieldSpecifier(FieldType.DECIMAL,10,3)
  54. ]
  55. def rows = this.writeRows( rowSpecifier, '|', 500000, new File("data.csv").newWriter())
  56. }
  57. private void writeRows(List rowSpecifier_, String delimeter_, int rowCount_, Writer out_){
  58. (0..rowCount_).each {
  59. out_ << this.generateRow(rowSpecifier_, delimeter_) + '\n'
  60. }
  61. out_.close()
  62. }
  63. private def generateRow(List rowSpecifier_, String delimeter_){
  64. def builder = new StringBuilder()
  65. rowSpecifier_.each {
  66. builder.append(this.generateFieldValue(it)+delimeter_)
  67. }
  68. // remove the last character
  69. return builder.toString()[0..-2]
  70. }
  71. private def generateFieldValue(FieldSpecifier fieldSpecifier_){
  72. switch (fieldSpecifier_.fieldType) {
  73. case FieldType.STRING:
  74. return generateStringFieldValue(fieldSpecifier_.length)
  75. case FieldType.INTEGER:
  76. return generateIntegerFieldValue(fieldSpecifier_.length)
  77. case FieldType.DECIMAL:
  78. return generateDecimalFieldValue(fieldSpecifier_.length,fieldSpecifier_.precision)
  79. default:
  80. break;
  81. }
  82. }
  83. private def generateStringFieldValue(int length_){
  84. return RandomStringUtils.random( length_, true, false)
  85. }
  86. private def generateIntegerFieldValue(int length_){
  87. return RandomStringUtils.random( length_, false, true)
  88. }
  89. private def generateDecimalFieldValue(int length_, int precision_){
  90. def integerString = RandomStringUtils.random( length_, false, true) << ''
  91. return integerString.insert(integerString.size() - precision_ , ".")
  92. }
  93. private class FieldSpecifier {
  94. private final FieldType fieldType;
  95. private final int length;
  96. private final int precision;
  97. public FieldSpecifier(FieldType fieldType_, int length_){
  98. this(fieldType_, length_, 0)
  99. }
  100. public FieldSpecifier(FieldType fieldType_, int length_, int precision_){
  101. fieldType = fieldType_
  102. length = length_
  103. precision = precision_
  104. }
  105. }
  106. }