質問編集履歴

3

修正

2017/01/22 13:02

投稿

dlrowolleh
dlrowolleh

スコア120

test CHANGED
@@ -1 +1 @@
1
- Ruby CSVファイルを作成したいのですが、うまくいきません
1
+ Ruby CSVファイルを作成したいのですが、うまくいきません:ループ処理:書き込みモードと追記モードとリダイレクトで結果が異なる。
test CHANGED
@@ -12,9 +12,9 @@
12
12
 
13
13
  3 <>不要<>
14
14
 
15
- 4 <>不要<>
15
+ 4 <>不要<>
16
-
16
+
17
- 5 <>不要<>
17
+ 5 <>不要<>
18
18
 
19
19
  6 <>不要<>
20
20
 
@@ -641,3 +641,183 @@
641
641
  from data.rb:3:in `<main>'
642
642
 
643
643
  ```
644
+
645
+ #追記 ループ処理が分からない
646
+
647
+ #a(追記モード)とw(上書きモード)で結果が異なる
648
+
649
+ > w-mode.rb(上書きモード)
650
+
651
+ ```Ruby
652
+
653
+ 1 require "csv"
654
+
655
+ 2
656
+
657
+ 3 open("utf-8.html", "r:utf-8") do |f|
658
+
659
+ 4 HEADER = ["年","月","日","時間","情報","A"]
660
+
661
+ 5 26.times { f.gets }
662
+
663
+ 6 cnt = 0
664
+
665
+ 7 out = nil
666
+
667
+ 8 f.each_line do |line|
668
+
669
+ 9 cnt += 1
670
+
671
+ 10 case cnt
672
+
673
+ 11 when 1
674
+
675
+ 12 name = line[/>(.*)</,1]
676
+
677
+ 13 out = [name]
678
+
679
+ 14 when 2,3,4,16
680
+
681
+ 15 name = line[/>(.*)</,1]
682
+
683
+ 16 out << name
684
+
685
+ 17 when 18
686
+
687
+ 18 name = line[/>(.*)</,1]
688
+
689
+ 19 out << namew
690
+
691
+ 20 when 23
692
+
693
+ 21 cnt = 0
694
+
695
+ 22 end
696
+
697
+ 23 CSV.open("w-mode.csv","w:utf-8", 7 年,月,日,時間,情報,A
698
+
699
+ 8 2017,01,21,23
700
+
701
+ 9 年,月,日,時間,情報,A
702
+
703
+ :headers => HEADER, :write_headers => true) do |file|
704
+
705
+ 24 file << out
706
+
707
+ 25 end
708
+
709
+ 26 end
710
+
711
+ 27 end
712
+
713
+ ```
714
+
715
+ 作成されたファイルの中身
716
+
717
+ > w-mode.csv
718
+
719
+ ```
720
+
721
+ 1 年,月,日,時間,情報,A
722
+
723
+ 2 ,,"",
724
+
725
+
726
+
727
+ ```
728
+
729
+
730
+
731
+ > a-mode.rb(追記書きモード)
732
+
733
+ ```Ruby
734
+
735
+ 1 require "csv"
736
+
737
+ 2
738
+
739
+ 3 open("utf-8.html", "r:utf-8") do |f|
740
+
741
+ 4 HEADER = ["年","月","日","時間","情報","A"]
742
+
743
+ 5 26.times { f.gets }
744
+
745
+ 6 cnt = 0
746
+
747
+ 7 out = nil
748
+
749
+ 8 f.each_line do |line|
750
+
751
+ 9 cnt += 1
752
+
753
+ 10 case cnt
754
+
755
+ 11 when 1
756
+
757
+ 12 name = line[/>(.*)</,1]
758
+
759
+ 13 out = [name]
760
+
761
+ 14 when 2,3,4,16
762
+
763
+ 15 name = line[/>(.*)</,1]
764
+
765
+ 16 out << name
766
+
767
+ 17 when 18
768
+
769
+ 18 name = line[/>(.*)</,1]
770
+
771
+ 19 out << namew
772
+
773
+ 20 when 23
774
+
775
+ 21 cnt = 0
776
+
777
+ 22 end
778
+
779
+ 23 CSV.open("a-mode.csv","a:utf-8", 7 年,月,日,時間,情報,A
780
+
781
+ 8 2017,01,21,23
782
+
783
+ 9 年,月,日,時間,情報,A
784
+
785
+ :headers => HEADER, :write_headers => true) do |file|
786
+
787
+ 24 file << out
788
+
789
+ 25 end
790
+
791
+ 26 end
792
+
793
+ 27 end
794
+
795
+ ```
796
+
797
+ > a-mode.csv
798
+
799
+ ```
800
+
801
+ 1 年,月,日,時間,情報,A(ヘッダ部)
802
+
803
+ 2 欲しい情報2017年
804
+
805
+ 3 年,月,日,時間,情報,A(ヘッダ部)
806
+
807
+ 4 欲しい情報2017年,欲しい情報01月
808
+
809
+ 5 年,月,日,時間,情報,A(ヘッダ部)
810
+
811
+ 6 欲しい情報2017年,欲しい情報01月,欲しい情報21時間
812
+
813
+ 7 年,月,日,時間,情報,A(ヘッダ部)
814
+
815
+ 8 欲しい情報2017年,欲しい情報01月,欲しい情報21時間,欲しい情報A
816
+
817
+ 〜省略〜
818
+
819
+
820
+
821
+
822
+
823
+ ```

2

追記

2017/01/22 13:02

投稿

dlrowolleh
dlrowolleh

スコア120

test CHANGED
File without changes
test CHANGED
@@ -166,6 +166,8 @@
166
166
 
167
167
  というファイルから、
168
168
 
169
+ > data.csv
170
+
169
171
  ```
170
172
 
171
173
  年,月,日,時間,情報,A,
@@ -410,7 +412,7 @@
410
412
 
411
413
  ファイルの読み込み、書き出しの処理を回す処理がどのようになるのか分かりません。
412
414
 
413
- ###余談
415
+ ###余談(解決済み)
414
416
 
415
417
  ```ruby
416
418
 
@@ -463,3 +465,179 @@
463
465
  そうでないか
464
466
 
465
467
  だけではないのですか?
468
+
469
+
470
+
471
+ `put`ではなく`print`だったらうまく行きました。
472
+
473
+ `put`と`orint`を勘違いしていました。
474
+
475
+
476
+
477
+ ###追記
478
+
479
+ 以下のプログラムで実行すると
480
+
481
+ ```Ruby
482
+
483
+ require "csv"
484
+
485
+
486
+
487
+ open("test.txt", "r:utf-8") do |f|
488
+
489
+ puts ["年","月","日","時間","情報","A"].to_csv
490
+
491
+ 26.times { f.gets }
492
+
493
+ cnt = 0
494
+
495
+ out = nil
496
+
497
+ f.each_line do |line|
498
+
499
+ cnt += 1
500
+
501
+ case cnt
502
+
503
+ when 1
504
+
505
+ name = line[/>(.*)</,1]
506
+
507
+ out = [name]
508
+
509
+ when 2,3,4,16
510
+
511
+ name = line[/>(.*)</,1]
512
+
513
+ out << name
514
+
515
+ when 18
516
+
517
+ name = line[/>(.*)</,1]
518
+
519
+ out << name
520
+
521
+ puts out.to_csv
522
+
523
+ when 23
524
+
525
+ cnt = 0
526
+
527
+ end
528
+
529
+ end
530
+
531
+ end
532
+
533
+ ```
534
+
535
+ > $ ruby csv.rb
536
+
537
+ 年,月,日,時間,情報,A,
538
+
539
+ 欲しい情報2017年,欲しい情報01月,欲しい情報19日,欲しい情報15時,欲しい情報,欲しい情報A
540
+
541
+ 欲しい情報2017年,欲しい情報01月,欲しい情報19日,欲しい情報15時,欲しい情報,欲しい情報A
542
+
543
+ ~省略~
544
+
545
+
546
+
547
+ 端末に表示されます。
548
+
549
+
550
+
551
+ > $ ruby csv.rb > data.csv
552
+
553
+
554
+
555
+ で端末への出力をファイルdata.csvへ書き込むことで
556
+
557
+ data.csv
558
+
559
+ が作成されるのですが、
560
+
561
+ > $ ruby csv.rb
562
+
563
+
564
+
565
+ data.csvで実現するにはどうしたらいいでしょうか。
566
+
567
+ > csv.rb
568
+
569
+
570
+
571
+ に変更したところ、エラーが出てしまっており、困っています。
572
+
573
+ ```Ruby
574
+
575
+ 1 require "csv"
576
+
577
+ 2
578
+
579
+ 3 open("test.txt", "r:utf-8") do |f|
580
+
581
+ 4 HEADER = ["年","月","日","時間","情報","A"].to_csv
582
+
583
+ 5 26.times { f.gets }
584
+
585
+ 6 cnt = 0
586
+
587
+ 7 out = nil
588
+
589
+ 8 f.each_line do |line|
590
+
591
+ 9 cnt += 1
592
+
593
+ 10 case cnt
594
+
595
+ 11 when 1
596
+
597
+ 12 name = line[/>(.*)</,1]
598
+
599
+ 13 out = [name]
600
+
601
+ 14 when 2,3,4,16
602
+
603
+ 15 name = line[/>(.*)</,1]
604
+
605
+ 16 out << name
606
+
607
+ 17 when 18
608
+
609
+ 18 name = line[/>(.*)</,1]
610
+
611
+ 19 out << name
612
+
613
+ 20 CSV.open("hoge.html","a:Windows-31J", headers => HEADER, :write_headers => true) do |file|
614
+
615
+ 21 file << out.to_csv
616
+
617
+ 22 end
618
+
619
+ 23 when 23
620
+
621
+ 24 cnt = 0
622
+
623
+ 25 end
624
+
625
+ 26 end
626
+
627
+ 27 end
628
+
629
+ ```
630
+
631
+ ```$ ruby data.rb
632
+
633
+ data.rb:20:in `block (2 levels) in <main>': undefined local variable or method `headers' for main:Object (NameError)
634
+
635
+ from data.rb:8:in `each_line'
636
+
637
+ from data.rb:8:in `block in <main>'
638
+
639
+ from data.rb:3:in `open'
640
+
641
+ from data.rb:3:in `<main>'
642
+
643
+ ```

1

追記

2017/01/20 07:13

投稿

dlrowolleh
dlrowolleh

スコア120

test CHANGED
File without changes
test CHANGED
@@ -409,3 +409,57 @@
409
409
  プログラムをどのように修正すればよいでしょうか。
410
410
 
411
411
  ファイルの読み込み、書き出しの処理を回す処理がどのようになるのか分かりません。
412
+
413
+ ###余談
414
+
415
+ ```ruby
416
+
417
+ 1 require "csv"
418
+
419
+ 2 open('test.txt', 'r:utf-8') do |f|
420
+
421
+ 3 f.each_line do |line|
422
+
423
+ 4 name = line[/>(.*)</,1]
424
+
425
+ 5 put name
426
+
427
+ 6 end
428
+
429
+ 7 end
430
+
431
+ ```
432
+
433
+ とすると
434
+
435
+ ```
436
+
437
+ hoge.rb:5:in `block (2 levels) in <main>': undefined method `put' for main:Object (NoMethodError)
438
+
439
+ from hoge.rb:3:in `each_line'
440
+
441
+ from hoge.rb:3:in `block in <main>'
442
+
443
+ from hoge.rb:2:in `open'
444
+
445
+ from hoge.rb:2:in `<main>'
446
+
447
+ ```
448
+
449
+ エラーが出ました。
450
+
451
+ なぜ`put`
452
+
453
+ ではエラーになって
454
+
455
+ `puts`
456
+
457
+ ではエラーになるのですか?
458
+
459
+ `put`と`puts`の違いは
460
+
461
+ 改行して出力するか
462
+
463
+ そうでないか
464
+
465
+ だけではないのですか?