tb 0.9 → 1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/README +13 -11
  3. data/lib/tb.rb +14 -6
  4. data/lib/tb/catreader.rb +2 -2
  5. data/lib/tb/cmd_consecutive.rb +6 -2
  6. data/lib/tb/cmd_crop.rb +22 -3
  7. data/lib/tb/cmd_cross.rb +24 -0
  8. data/lib/tb/cmd_cut.rb +20 -10
  9. data/lib/tb/cmd_git.rb +20 -7
  10. data/lib/tb/cmd_group.rb +32 -0
  11. data/lib/tb/cmd_gsub.rb +21 -0
  12. data/lib/tb/cmd_join.rb +28 -0
  13. data/lib/tb/cmd_ls.rb +9 -0
  14. data/lib/tb/cmd_melt.rb +15 -0
  15. data/lib/tb/cmd_mheader.rb +15 -0
  16. data/lib/tb/cmd_nest.rb +27 -6
  17. data/lib/tb/cmd_newfield.rb +19 -2
  18. data/lib/tb/cmd_rename.rb +20 -0
  19. data/lib/tb/{cmd_grep.rb → cmd_search.rb} +37 -23
  20. data/lib/tb/cmd_shape.rb +69 -25
  21. data/lib/tb/cmd_sort.rb +20 -0
  22. data/lib/tb/cmd_tar.rb +38 -0
  23. data/lib/tb/cmd_to_json.rb +2 -2
  24. data/lib/tb/cmd_to_ltsv.rb +3 -3
  25. data/lib/tb/cmd_to_pnm.rb +3 -3
  26. data/lib/tb/cmd_to_tsv.rb +3 -3
  27. data/lib/tb/cmd_to_yaml.rb +3 -3
  28. data/lib/tb/cmd_unmelt.rb +15 -0
  29. data/lib/tb/cmd_unnest.rb +31 -7
  30. data/lib/tb/cmdmain.rb +2 -0
  31. data/lib/tb/cmdtop.rb +1 -1
  32. data/lib/tb/cmdutil.rb +9 -62
  33. data/lib/tb/csv.rb +21 -79
  34. data/lib/tb/enumerable.rb +42 -68
  35. data/lib/tb/enumerator.rb +15 -7
  36. data/lib/tb/{fieldset.rb → hashreader.rb} +37 -56
  37. data/lib/tb/hashwriter.rb +54 -0
  38. data/lib/tb/headerreader.rb +108 -0
  39. data/lib/tb/headerwriter.rb +116 -0
  40. data/lib/tb/json.rb +17 -15
  41. data/lib/tb/ltsv.rb +35 -96
  42. data/lib/tb/ndjson.rb +63 -0
  43. data/lib/tb/numericreader.rb +66 -0
  44. data/lib/tb/numericwriter.rb +61 -0
  45. data/lib/tb/pnm.rb +206 -200
  46. data/lib/tb/ropen.rb +54 -59
  47. data/lib/tb/tsv.rb +39 -71
  48. data/sample/excel2csv +24 -25
  49. data/sample/poi-xls2csv.rb +13 -14
  50. data/tb.gemspec +154 -0
  51. data/test/test_cmd_cat.rb +28 -6
  52. data/test/test_cmd_consecutive.rb +8 -3
  53. data/test/test_cmd_cut.rb +14 -4
  54. data/test/test_cmd_git_log.rb +50 -50
  55. data/test/test_cmd_grep.rb +6 -6
  56. data/test/test_cmd_gsub.rb +7 -2
  57. data/test/test_cmd_ls.rb +70 -62
  58. data/test/test_cmd_shape.rb +43 -6
  59. data/test/test_cmd_svn_log.rb +26 -27
  60. data/test/test_cmd_to_csv.rb +10 -5
  61. data/test/test_cmd_to_json.rb +16 -0
  62. data/test/test_cmd_to_ltsv.rb +2 -2
  63. data/test/test_cmd_to_pp.rb +7 -2
  64. data/test/test_csv.rb +74 -62
  65. data/test/test_ex_enumerable.rb +0 -1
  66. data/test/test_fileenumerator.rb +3 -3
  67. data/test/test_headercsv.rb +43 -0
  68. data/test/test_json.rb +2 -2
  69. data/test/test_ltsv.rb +22 -17
  70. data/test/test_ndjson.rb +62 -0
  71. data/test/test_numericcsv.rb +36 -0
  72. data/test/test_pnm.rb +69 -70
  73. data/test/test_reader.rb +27 -124
  74. data/test/test_tbenum.rb +18 -18
  75. data/test/test_tsv.rb +21 -32
  76. data/test/util_tbtest.rb +12 -0
  77. metadata +41 -19
  78. data/lib/tb/basic.rb +0 -1070
  79. data/lib/tb/reader.rb +0 -106
  80. data/lib/tb/record.rb +0 -158
  81. data/test/test_basic.rb +0 -403
  82. data/test/test_fieldset.rb +0 -42
  83. data/test/test_record.rb +0 -61
@@ -61,6 +61,21 @@ def (Tb::Cmd).op_melt
61
61
  op
62
62
  end
63
63
 
64
+ Tb::Cmd.def_vhelp('melt', <<'End')
65
+ Example:
66
+
67
+ % cat tst.csv
68
+ foo,bar,baz
69
+ A,1,x
70
+ B,2,y
71
+ % tb melt foo tst.csv
72
+ foo,variable,value
73
+ A,bar,1
74
+ A,baz,x
75
+ B,bar,2
76
+ B,baz,y
77
+ End
78
+
64
79
  def (Tb::Cmd).main_melt(argv)
65
80
  op_melt.parse!(argv)
66
81
  exit_if_help('melt')
@@ -39,6 +39,21 @@ def (Tb::Cmd).op_mheader
39
39
  op
40
40
  end
41
41
 
42
+ Tb::Cmd.def_vhelp('mheader', <<'End')
43
+ Example:
44
+
45
+ % cat tst.csv
46
+ foo,foo,bar,bar
47
+ baz,qux,baz,qux
48
+ 1,2,3,4
49
+ 5,6,7,8
50
+ % tb mheader tst.csv
51
+ foo baz,foo qux,bar baz,bar qux
52
+ 1,2,3,4
53
+ 5,6,7,8
54
+ End
55
+
56
+
42
57
  def (Tb::Cmd).main_mheader(argv)
43
58
  op_mheader.parse!(argv)
44
59
  exit_if_help('mheader')
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2011-2012 Tanaka Akira <akr@fsij.org>
1
+ # Copyright (C) 2011-2014 Tanaka Akira <akr@fsij.org>
2
2
  #
3
3
  # Redistribution and use in source and binary forms, with or without
4
4
  # modification, are permitted provided that the following conditions
@@ -36,6 +36,28 @@ def (Tb::Cmd).op_nest
36
36
  op
37
37
  end
38
38
 
39
+ Tb::Cmd.def_vhelp('nest', <<'End')
40
+ Example:
41
+
42
+ % cat tst.csv
43
+ name,author,length
44
+ foo,A,3
45
+ bar,A,5
46
+ baz,B,2
47
+ qux,B,8
48
+ % tb nest item,name,length tst.csv
49
+ author,item
50
+ A,"name,length
51
+ foo,3
52
+ bar,5
53
+ "
54
+ B,"name,length
55
+ baz,2
56
+ qux,8
57
+ "
58
+ End
59
+
60
+
39
61
  def (Tb::Cmd).main_nest(argv)
40
62
  op_nest.parse!(argv)
41
63
  exit_if_help('nest')
@@ -71,11 +93,10 @@ def (Tb::Cmd).main_nest(argv)
71
93
  nested << pairs.reject {|f, v| !oldfields_hash[f] }
72
94
  }
73
95
  after_group = lambda {|(_, last_pairs)|
74
- Tb.csv_stream_output(nested_csv="") {|ngen|
75
- ngen << oldfields
76
- nested.each {|npairs|
77
- ngen << oldfields.map {|of| npairs[of] }
78
- }
96
+ nested_csv = ""
97
+ nested_csv << oldfields.to_csv
98
+ nested.each {|npairs|
99
+ nested_csv << oldfields.map {|of| npairs[of] }.to_csv
79
100
  }
80
101
  assoc = last_pairs.reject {|f, v| oldfields_hash[f] }.to_a
81
102
  assoc << [newfield, nested_csv]
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2011-2012 Tanaka Akira <akr@fsij.org>
1
+ # Copyright (C) 2011-2014 Tanaka Akira <akr@fsij.org>
2
2
  #
3
3
  # Redistribution and use in source and binary forms, with or without
4
4
  # modification, are permitted provided that the following conditions
@@ -41,6 +41,23 @@ def (Tb::Cmd).op_newfield
41
41
  op
42
42
  end
43
43
 
44
+ Tb::Cmd.def_vhelp('newfield', <<'End')
45
+ Example:
46
+
47
+ % cat tst.csv
48
+ a,b,c
49
+ 0,1,2
50
+ 4,5,6
51
+ % tb newfield foo bar tst.csv
52
+ foo,a,b,c
53
+ bar,0,1,2
54
+ bar,4,5,6
55
+ % tb newfield foo --ruby '_["b"] + _["c"]' tst.csv
56
+ foo,a,b,c
57
+ 12,0,1,2
58
+ 56,4,5,6
59
+ End
60
+
44
61
  def (Tb::Cmd).main_newfield(argv)
45
62
  op_newfield.parse!(argv)
46
63
  exit_if_help('newfield')
@@ -50,7 +67,7 @@ def (Tb::Cmd).main_newfield(argv)
50
67
  rubyexp = Tb::Cmd.opt_newfield_ruby
51
68
  pr = eval("lambda {|_| #{rubyexp} }")
52
69
  else
53
- err('no ruby expression given.') if argv.empty?
70
+ err('no value given.') if argv.empty?
54
71
  value = argv.shift
55
72
  pr = lambda {|_| value }
56
73
  end
@@ -36,6 +36,26 @@ def (Tb::Cmd).op_rename
36
36
  op
37
37
  end
38
38
 
39
+ Tb::Cmd.def_vhelp('rename', <<'End')
40
+ Example:
41
+
42
+ % cat tst.csv
43
+ foo,bar,baz
44
+ 1,2,3
45
+ 4,5,6
46
+ 7,8,9
47
+ % tb rename bar,qux tst.csv
48
+ foo,qux,baz
49
+ 1,2,3
50
+ 4,5,6
51
+ 7,8,9
52
+ % tb rename bar,qux,baz,quux tst.csv
53
+ foo,qux,quux
54
+ 1,2,3
55
+ 4,5,6
56
+ 7,8,9
57
+ End
58
+
39
59
  def (Tb::Cmd).main_rename(argv)
40
60
  op_rename.parse!(argv)
41
61
  exit_if_help('rename')
@@ -26,41 +26,55 @@
26
26
  # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
27
27
  # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
28
 
29
- Tb::Cmd.subcommands << 'grep'
29
+ Tb::Cmd.subcommands << 'search'
30
30
 
31
- Tb::Cmd.default_option[:opt_grep_e] = nil
32
- Tb::Cmd.default_option[:opt_grep_ruby] = nil
33
- Tb::Cmd.default_option[:opt_grep_f] = nil
34
- Tb::Cmd.default_option[:opt_grep_v] = nil
31
+ Tb::Cmd.default_option[:opt_search_e] = nil
32
+ Tb::Cmd.default_option[:opt_search_ruby] = nil
33
+ Tb::Cmd.default_option[:opt_search_f] = nil
34
+ Tb::Cmd.default_option[:opt_search_v] = nil
35
35
 
36
- def (Tb::Cmd).op_grep
36
+ def (Tb::Cmd).op_search
37
37
  op = OptionParser.new
38
- op.banner = "Usage: tb grep [OPTS] REGEXP [TABLE ...]\n" +
38
+ op.banner = "Usage: tb search [OPTS] REGEXP [TABLE ...]\n" +
39
39
  "Search rows using regexp or ruby expression."
40
40
  define_common_option(op, "hNo", "--no-pager")
41
- op.def_option('-f FIELD', 'search field') {|field| Tb::Cmd.opt_grep_f = field }
42
- op.def_option('-e REGEXP', 'specify a regexp.') {|pattern| Tb::Cmd.opt_grep_e = pattern }
43
- op.def_option('--ruby RUBY-EXP', 'predicate written in ruby. A hash is given as _. no usual regexp argument.') {|ruby_exp| Tb::Cmd.opt_grep_ruby = ruby_exp }
44
- op.def_option('-v', 'ouput the records which doesn\'t match') { Tb::Cmd.opt_grep_v = true }
41
+ op.def_option('-f FIELD', 'search field') {|field| Tb::Cmd.opt_search_f = field }
42
+ op.def_option('-e REGEXP', 'specify a regexp.') {|pattern| Tb::Cmd.opt_search_e = pattern }
43
+ op.def_option('--ruby RUBY-EXP', 'predicate written in ruby. A hash is given as _. no usual regexp argument.') {|ruby_exp| Tb::Cmd.opt_search_ruby = ruby_exp }
44
+ op.def_option('-v', 'ouput the records which doesn\'t match') { Tb::Cmd.opt_search_v = true }
45
45
  op
46
46
  end
47
47
 
48
- def (Tb::Cmd).main_grep(argv)
49
- op_grep.parse!(argv)
50
- exit_if_help('grep')
51
- if Tb::Cmd.opt_grep_ruby
52
- pred = eval("lambda {|_| #{Tb::Cmd.opt_grep_ruby} }")
53
- elsif Tb::Cmd.opt_grep_e
54
- re = Regexp.new(Tb::Cmd.opt_grep_e)
55
- pred = Tb::Cmd.opt_grep_f ? lambda {|_| re =~ _[Tb::Cmd.opt_grep_f] } :
56
- lambda {|_| _.any? {|k, v| re =~ v.to_s } }
48
+ Tb::Cmd.def_vhelp('search', <<'End')
49
+ Example:
50
+
51
+ % cat tst.csv
52
+ a,b,c
53
+ 0,1,2
54
+ 4,5,6
55
+ % tb search 0 tst.csv
56
+ a,b,c
57
+ 0,1,2
58
+ End
59
+
60
+ def (Tb::Cmd).main_search(argv)
61
+ op_search.parse!(argv)
62
+ exit_if_help('search')
63
+ if Tb::Cmd.opt_search_ruby
64
+ pred = eval("lambda {|_| #{Tb::Cmd.opt_search_ruby} }")
65
+ elsif Tb::Cmd.opt_search_e
66
+ re = Regexp.new(Tb::Cmd.opt_search_e)
67
+ pred = Tb::Cmd.opt_search_f ?
68
+ lambda {|_| re =~ _[Tb::Cmd.opt_search_f] } :
69
+ lambda {|_| _.any? {|k, v| re =~ v.to_s } }
57
70
  else
58
71
  err("no regexp given.") if argv.empty?
59
72
  re = Regexp.new(argv.shift)
60
- pred = Tb::Cmd.opt_grep_f ? lambda {|_| re =~ _[Tb::Cmd.opt_grep_f] } :
61
- lambda {|_| _.any? {|k, v| re =~ v.to_s } }
73
+ pred = Tb::Cmd.opt_search_f ?
74
+ lambda {|_| re =~ _[Tb::Cmd.opt_search_f] } :
75
+ lambda {|_| _.any? {|k, v| re =~ v.to_s } }
62
76
  end
63
- opt_v = Tb::Cmd.opt_grep_v ? true : false
77
+ opt_v = Tb::Cmd.opt_search_v ? true : false
64
78
  argv = ['-'] if argv.empty?
65
79
  creader = Tb::CatReader.open(argv, Tb::Cmd.opt_N)
66
80
  er = Tb::Enumerator.new {|y|
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2011-2012 Tanaka Akira <akr@fsij.org>
1
+ # Copyright (C) 2011-2014 Tanaka Akira <akr@fsij.org>
2
2
  #
3
3
  # Redistribution and use in source and binary forms, with or without
4
4
  # modification, are permitted provided that the following conditions
@@ -36,38 +36,82 @@ def (Tb::Cmd).op_shape
36
36
  op
37
37
  end
38
38
 
39
+ Tb::Cmd.def_vhelp('shape', <<'End')
40
+ Example:
41
+
42
+ % cat tst.csv
43
+ foo,bar,baz
44
+ 1,2,3
45
+ 4,5
46
+ 6,7,8,9
47
+ % tb shape tst.csv -o json:-
48
+ [
49
+ {
50
+ "filename": "tst.csv",
51
+ "records": 3,
52
+ "min_pairs": 2,
53
+ "max_pairs": 3,
54
+ "header_fields": 3,
55
+ "min_fields": 2,
56
+ "max_fields": 4
57
+ }
58
+ ]
59
+ End
60
+
39
61
  def (Tb::Cmd).main_shape(argv)
40
62
  op_shape.parse!(argv)
41
63
  exit_if_help('shape')
42
64
  filenames = argv.empty? ? ['-'] : argv
43
- result = Tb.new(%w[header_fields min_fields max_fields records filename])
44
- filenames.each {|filename|
45
- tablereader_open(filename) {|tblreader|
46
- min_num_fields = nil
47
- max_num_fields = nil
48
- num_records = 0
49
- num_header_fields = nil
50
- tblreader.with_header {|header|
51
- num_header_fields = header.length
52
- }.each {|pairs|
53
- ary = pairs.values
54
- num_records += 1
55
- n = ary.length
56
- if min_num_fields.nil?
57
- min_num_fields = max_num_fields = n
58
- else
59
- min_num_fields = n if n < min_num_fields
60
- max_num_fields = n if max_num_fields < n
65
+ ter = Tb::Enumerator.new {|y|
66
+ filenames.each {|filename|
67
+ tablereader_open(filename) {|tblreader|
68
+ tblreader.enable_warning = false if tblreader.respond_to? :enable_warning
69
+ num_records = 0
70
+ num_header_fields = nil
71
+ min_num_fields = nil
72
+ max_num_fields = nil
73
+ if tblreader.respond_to? :header_array_hook
74
+ tblreader.header_array_hook = lambda {|header|
75
+ num_header_fields = header.length
76
+ }
77
+ end
78
+ if tblreader.respond_to? :row_array_hook
79
+ tblreader.row_array_hook = lambda {|ary|
80
+ n = ary.length
81
+ if min_num_fields.nil?
82
+ min_num_fields = max_num_fields = n
83
+ else
84
+ min_num_fields = n if n < min_num_fields
85
+ max_num_fields = n if max_num_fields < n
86
+ end
87
+ }
61
88
  end
89
+ min_num_pairs = nil
90
+ max_num_pairs = nil
91
+ tblreader.each {|pairs|
92
+ num_records += 1
93
+ n = pairs.length
94
+ if min_num_pairs.nil?
95
+ min_num_pairs = max_num_pairs = n
96
+ else
97
+ min_num_pairs = n if n < min_num_pairs
98
+ max_num_pairs = n if max_num_pairs < n
99
+ end
100
+ }
101
+ h = {
102
+ 'filename'=>filename,
103
+ 'records'=>num_records,
104
+ 'min_pairs'=>min_num_pairs,
105
+ 'max_pairs'=>max_num_pairs,
106
+ }
107
+ h['header_fields'] = num_header_fields if num_header_fields
108
+ h['min_fields'] = min_num_fields if min_num_fields
109
+ h['max_fields'] = max_num_fields if max_num_fields
110
+ y.yield(h)
62
111
  }
63
- result.insert({'header_fields'=>num_header_fields,
64
- 'min_fields'=>min_num_fields,
65
- 'max_fields'=>max_num_fields,
66
- 'records'=>num_records,
67
- 'filename'=>filename})
68
112
  }
69
113
  }
70
114
  Tb::Cmd.opt_N = false
71
- output_tbenum(result)
115
+ output_tbenum(ter)
72
116
  end
73
117
 
@@ -41,6 +41,26 @@ def (Tb::Cmd).op_sort
41
41
  op
42
42
  end
43
43
 
44
+ Tb::Cmd.def_vhelp('sort', <<'End')
45
+ Example:
46
+
47
+ % cat tst.csv
48
+ name,value
49
+ foo,1
50
+ bar,8
51
+ baz,2
52
+ % tb sort tst.csv
53
+ name,value
54
+ bar,8
55
+ baz,2
56
+ foo,1
57
+ % tb sort -f value tst.csv
58
+ name,value
59
+ foo,1
60
+ baz,2
61
+ bar,8
62
+ End
63
+
44
64
  def (Tb::Cmd).main_sort(argv)
45
65
  op_sort.parse!(argv)
46
66
  exit_if_help('sort')
@@ -43,6 +43,44 @@ def (Tb::Cmd).op_tar
43
43
  op
44
44
  end
45
45
 
46
+ Tb::Cmd.def_vhelp('tar', <<'End')
47
+ Example:
48
+
49
+ % tb tar ruby-1.8.7.tar.bz2|head
50
+ mode,filemode,uid,user,gid,group,devmajor,devminor,size,mtime,path,linkname
51
+ 0755,drwxr-xr-x,1001,knu,0,wheel,0,0,0,2008-06-01T00:19:03+09:00,ruby-1.8.7/,""
52
+ 0755,drwxr-xr-x,1001,knu,0,wheel,0,0,0,2008-06-01T00:18:24+09:00,ruby-1.8.7/ext/,""
53
+ 0755,drwxr-xr-x,1001,knu,0,wheel,0,0,0,2008-06-01T00:18:25+09:00,ruby-1.8.7/doc/,""
54
+ 0644,-rw-r--r--,1001,knu,0,wheel,0,0,5011,2008-05-31T23:57:11+09:00,ruby-1.8.7/Makefile.in,""
55
+ 0644,-rw-r--r--,1001,knu,0,wheel,0,0,124521,2008-05-31T20:44:49+09:00,ruby-1.8.7/parse.y,""
56
+ 0644,-rw-r--r--,1001,knu,0,wheel,0,0,32308,2008-05-29T20:23:36+09:00,ruby-1.8.7/README.EXT,""
57
+ 0644,-rw-r--r--,1001,knu,0,wheel,0,0,19502,2008-05-31T20:44:49+09:00,ruby-1.8.7/intern.h,""
58
+ 0644,-rw-r--r--,1001,knu,0,wheel,0,0,22581,2008-05-23T14:22:13+09:00,ruby-1.8.7/class.c,""
59
+ 0755,drwxr-xr-x,1001,knu,0,wheel,0,0,0,2008-06-01T00:18:24+09:00,ruby-1.8.7/djgpp/,""
60
+ % tb tar -l ruby-1.8.7.tar.bz2|head
61
+ mode,filemode,uid,user,gid,group,devmajor,devminor,size,mtime,atime,ctime,path,linkname,size_in_tar,tar_typeflag,tar_magic,tar_version,tar_chksum
62
+ 0755,drwxr-xr-x,1001,knu,0,wheel,0,0,0,2008-06-01T00:19:03.000000000+09:00,,,ruby-1.8.7/,"",512,5,ustar,00,5406
63
+ 0755,drwxr-xr-x,1001,knu,0,wheel,0,0,0,2008-06-01T00:18:24.000000000+09:00,,,ruby-1.8.7/ext/,"",512,5,ustar,00,5779
64
+ 0755,drwxr-xr-x,1001,knu,0,wheel,0,0,0,2008-06-01T00:18:25.000000000+09:00,,,ruby-1.8.7/doc/,"",512,5,ustar,00,5753
65
+ 0644,-rw-r--r--,1001,knu,0,wheel,0,0,5011,2008-05-31T23:57:11.000000000+09:00,,,ruby-1.8.7/Makefile.in,"",5632,0,ustar,00,6467
66
+ 0644,-rw-r--r--,1001,knu,0,wheel,0,0,124521,2008-05-31T20:44:49.000000000+09:00,,,ruby-1.8.7/parse.y,"",125440,0,ustar,00,6114
67
+ 0644,-rw-r--r--,1001,knu,0,wheel,0,0,32308,2008-05-29T20:23:36.000000000+09:00,,,ruby-1.8.7/README.EXT,"",33280,0,ustar,00,6133
68
+ 0644,-rw-r--r--,1001,knu,0,wheel,0,0,19502,2008-05-31T20:44:49.000000000+09:00,,,ruby-1.8.7/intern.h,"",20480,0,ustar,00,6216
69
+ 0644,-rw-r--r--,1001,knu,0,wheel,0,0,22581,2008-05-23T14:22:13.000000000+09:00,,,ruby-1.8.7/class.c,"",23552,0,ustar,00,6093
70
+ 0755,drwxr-xr-x,1001,knu,0,wheel,0,0,0,2008-06-01T00:18:24.000000000+09:00,,,ruby-1.8.7/djgpp/,"",512,5,ustar,00,5975
71
+ % tb tar -l --hash=md5 ruby-1.8.7.tar.bz2|head
72
+ mode,filemode,uid,user,gid,group,devmajor,devminor,size,mtime,atime,ctime,path,linkname,size_in_tar,tar_typeflag,tar_magic,tar_version,tar_chksum,md5
73
+ 0755,drwxr-xr-x,1001,knu,0,wheel,0,0,0,2008-06-01T00:19:03.000000000+09:00,,,ruby-1.8.7/,"",512,5,ustar,00,5406,
74
+ 0755,drwxr-xr-x,1001,knu,0,wheel,0,0,0,2008-06-01T00:18:24.000000000+09:00,,,ruby-1.8.7/ext/,"",512,5,ustar,00,5779,
75
+ 0755,drwxr-xr-x,1001,knu,0,wheel,0,0,0,2008-06-01T00:18:25.000000000+09:00,,,ruby-1.8.7/doc/,"",512,5,ustar,00,5753,
76
+ 0644,-rw-r--r--,1001,knu,0,wheel,0,0,5011,2008-05-31T23:57:11.000000000+09:00,,,ruby-1.8.7/Makefile.in,"",5632,0,ustar,00,6467,1c038d48e3132822f18bf758a81e1794
77
+ 0644,-rw-r--r--,1001,knu,0,wheel,0,0,124521,2008-05-31T20:44:49.000000000+09:00,,,ruby-1.8.7/parse.y,"",125440,0,ustar,00,6114,6f6bd781876136a7a71cf0ffcd6ecabc
78
+ 0644,-rw-r--r--,1001,knu,0,wheel,0,0,32308,2008-05-29T20:23:36.000000000+09:00,,,ruby-1.8.7/README.EXT,"",33280,0,ustar,00,6133,22785b26a8eb77bd426a09f0d493228b
79
+ 0644,-rw-r--r--,1001,knu,0,wheel,0,0,19502,2008-05-31T20:44:49.000000000+09:00,,,ruby-1.8.7/intern.h,"",20480,0,ustar,00,6216,cf8876629465d2e8fcefbe71c21915a7
80
+ 0644,-rw-r--r--,1001,knu,0,wheel,0,0,22581,2008-05-23T14:22:13.000000000+09:00,,,ruby-1.8.7/class.c,"",23552,0,ustar,00,6093,bff1443982b7f0261ce45db9375e5881
81
+ 0755,drwxr-xr-x,1001,knu,0,wheel,0,0,0,2008-06-01T00:18:24.000000000+09:00,,,ruby-1.8.7/djgpp/,"",512,5,ustar,00,5975,
82
+ End
83
+
46
84
  Tb::Cmd::TAR_RECORD_LENGTH = 512
47
85
  Tb::Cmd::TAR_HEADER_STRUCTURE = [
48
86
  [:name, "Z100"], # [POSIX] NUL-terminated character strings except when all characters in the array contain non-NUL characters including the last character.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2011-2012 Tanaka Akira <akr@fsij.org>
1
+ # Copyright (C) 2011-2014 Tanaka Akira <akr@fsij.org>
2
2
  #
3
3
  # Redistribution and use in source and binary forms, with or without
4
4
  # modification, are permitted provided that the following conditions
@@ -49,7 +49,7 @@ def (Tb::Cmd).main_to_json(argv)
49
49
  tablereader_open(filename) {|tblreader|
50
50
  tblreader.each {|pairs|
51
51
  out.print sep if sep
52
- out.print JSON.pretty_generate(Hash[pairs.to_a])
52
+ out.print JSON.pretty_generate(pairs)
53
53
  sep = ",\n"
54
54
  }
55
55
  }
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2013 Tanaka Akira <akr@fsij.org>
1
+ # Copyright (C) 2013-2014 Tanaka Akira <akr@fsij.org>
2
2
  #
3
3
  # Redistribution and use in source and binary forms, with or without
4
4
  # modification, are permitted provided that the following conditions
@@ -40,9 +40,9 @@ def (Tb::Cmd).main_to_ltsv(argv)
40
40
  op_to_ltsv.parse!(argv)
41
41
  exit_if_help('to-ltsv')
42
42
  argv = ['-'] if argv.empty?
43
- tbl = Tb::CatReader.open(argv, Tb::Cmd.opt_N).to_tb
43
+ reader = Tb::CatReader.open(argv, Tb::Cmd.opt_N)
44
44
  with_output {|out|
45
- tbl_generate_ltsv(tbl, out)
45
+ reader.write_to_ltsv(out)
46
46
  }
47
47
  end
48
48