csvデータの番号付加について

このQ&Aのポイント
  • csvデータの内容を番号付きの新しい列に変換する方法についてアドバイスをお願いします
  • 元のデータには5つの配列があり、指定された特定の配列のみを使用して、タブ区切りのcsvデータを作成します
  • まだ配列の宣言をしていないため、新しい配列を宣言してcsvデータを作成する方法についてアドバイスをお願いします
回答を見る
  • ベストアンサー

csvデータの番号付加について。

例題の csvデータの内容が 配列1 aaaaa aaaaa aaaaa bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb ccccc ccccc だった場合、配列が1つ増え ↓ 配列1 配列2 aaaaa 00001-1 aaaaa 00001-2 aaaaa 00001-3 bbbbb 00002-1 bbbbb 00002-2 bbbbb 00002-3 bbbbb 00002-4 bbbbb 00002-5 ccccc 00003-1 ccccc 00003-2 管理番号が増えていきます。 Sub main() Dim branch As Long Dim count As Long Dim i As Long Dim tmp As Long tmp = FreeFile Dim data As Variant With CreateObject("Scripting.FileSystemObject").GetFile("C:\データ.csv").OpenAsTextStream data = Split(.readall, vbCrLf) End With branch = 1 count = 1 Open "C:\出力データ.csv" For Output As #tmp Print #tmp, data(i) & vbTab & Format(branch, "00000") & vbTab & count For i = LBound(data) + 1 To UBound(data) If data(i) = data(i - 1) Then count = count + 1 Else branch = branch + 1 count = 1 End If Print #tmp, data(i) & vbTab & Format(branch, "00000") & vbTab & count Next i Close #tmp End Sub 例えば、タブ区切りの配列が元データで5つあり 配列5番目だけを指定し、例題のようにcsvを作成したいのですが 配列の宣言はまだしておりません。 アドバイスいただけないでしょうか。 よろしくお願いいたします。 元データ 配列1 配列2 配列3 配列4 配列5 a 1 c a aaaaa a 2 c b aaaaa a 3 c c aaaaa a 4 c d bbbbb a 5 c e bbbbb a 6 c f bbbbb a 7 c g bbbbb a 8 c h bbbbb a 9 c i ccccc a 0 c j ccccc 出力データ 配列1 配列2 配列3 配列4 配列5 配列6 a 1 c a aaaaa 00001-1 a 2 c b aaaaa 00001-2 a 3 c c aaaaa 00001-3 a 4 c d bbbbb 00002-1 a 5 c e bbbbb 00002-2 a 6 c f bbbbb 00002-3 a 7 c g bbbbb 00002-4 a 8 c h bbbbb 00002-5 a 9 c i ccccc 00003-1 a 0 c j ccccc 00003-2

質問者が選んだベストアンサー

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.3

#2 HohoPapaです。 追記します。 タブ区切りのテキストファイルで、拡張子がcsvなんですね? また、無駄なコードがあるので、直してみました。 Sub sample()  Dim buf As String  Dim tmp As Variant  Dim ColCnt As Long  Dim ChkData As Variant  Dim n As Long  Dim m As Long  Dim l As Long 'Lineカウンター    '変数の初期設定  n = 0  m = 0  l = 0  ChkData = ""    Open "C:\test\Getdata.csv" For Input As #1  Open "C:\test\Putdata.csv" For Output As #2     Do   If EOF(1) Then Exit Do   Line Input #1, buf   l = l + 1   tmp = Split(buf, vbTab)      '列数算出   If l = 1 Then    ColCnt = UBound(tmp)   End If      If ChkData = tmp(ColCnt) Then    m = m + 1   Else    m = 1    n = n + 1   End If   Print #2, buf & vbTab & Format(n, "00000") & "-" & m   ChkData = tmp(ColCnt)    Loop    Close #1  Close #2 End Sub

yairi1106
質問者

お礼

コードのご提示ありがとうございます。率直にいうと解決しました。区切りをカウントすればいいんですね。助かりました。エクセル上や、アクセス上でも、検証していたのですが、ファイル数が多いと作業効率が悪かったり、フィールドやレコード数が多いと、機能しなかったりで困ってました。今回はどうもありがとうございました。

その他の回答 (2)

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.2

>例えば、タブ区切りの配列が元データで5つあり >配列5番目だけを指定し、例題のようにcsvを作成したい タブ区切りのテキストファイルがある。 このレコードの最終列をもとに 00001-1 の形式で、連番を付し、 これを最終列の後にに追加する。 ということでいいでしょうか? 一方、 Printで書き出すことのできるファイルなら OpenAsTextStreamを使う必要はなく、 Line Inputでいいだろうと思います。 この仕様でよければ、 後記コードはいかがでしょうか? Option Explicit Sub sample()  Dim buf As String  Dim tmp As Variant  Dim PutLine As String  Dim ColCnt As Long  Dim i As Long  Dim ChkData As Variant  Dim n As Long  Dim m As Long  Dim l As Long 'Lineカウンター    '変数の初期設定  n = 0  m = 0  l = 0  ChkData = ""    Open "C:\test\Getdata.txt" For Input As #1  Open "C:\test\Putdata.txt" For Output As #2     Do   If EOF(1) Then Exit Do   Line Input #1, buf   l = l + 1   tmp = Split(buf, vbTab)      '列数算出   If l = 1 Then    ColCnt = UBound(tmp)   End If      If ChkData = tmp(ColCnt) Then    m = m + 1   Else    m = 1    n = n + 1   End If         PutLine = ""   For i = 0 To ColCnt    PutLine = PutLine & tmp(i) & vbTab   Next i   PutLine = PutLine & Format(n, "00000") & "-" & m   ChkData = tmp(ColCnt)   Print #2, PutLine _    Loop    Close #1  Close #2 End Sub

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

「配列」という、用語の使用法に違和感を持った。 それで、質問で何を求めているか、理解に迷う。 例えば、「https://www.pc-master.jp/sousa/csv.html の「列・項目のことをフィールド、行のことをレコードといいます」のフォールド の意味で、項目やフィールドというほうが、よいのでは。 ーーー データが完成後に、(オフラインバッチ処置)、番号データをデータの新フィールドにくわえるのなら、(使えるVBAコードも、すでにできているのだから)質問するまでもないようにおもうが。 ーー 普通は別項目に基づいて(例えば、店別付番を班別附番も加える場合など) 各項目別にソートし直して、附番プログラムを使えばできるのでは。 その際、FSOにはソートユテリティ、ステートメント・コマンド?がなかったと思うので、どうするか。 一旦エクセルシートを使うか。  こういうのは、小生の勘違いだろうか。 === もしこの状態で、適当な回答が出なければ、質問の趣旨を説明してみてほしい。

関連するQ&A

  • セルの値を転記

    下記のコードで sub main() Dim i As Long Dim rowToWrite As Long Dim 最終行 As Long Dim result As Variant Dim tmp As Variant Dim j As Long 最終行 = Range("B1").End(xlDown).Row result = Cells(1, 1).Resize(最終行, 2).Value For rowToWrite = 1 To 最終行 If tmp <> result(rowToWrite, 2) Then i = i + 1 j = 1 result(rowToWrite, 1) = i & "-" & j tmp = result(rowToWrite, 2) Else j = j + 1 result(rowToWrite, 1) = i & "-" & j End If Next rowToWrite Cells(1, 1).Resize(最終行, 2).Value = result End Sub Bセルの値が aaaaa aaaaa aaaaa bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb ccccc ccccc だった場合 ↓ Aセル,Bセル 1-1,aaaaa 1-2,aaaaa 1-3,aaaaa 2-1,bbbbb 2-2,bbbbb 2-3,bbbbb 2-4,bbbbb 2-5,bbbbb 2-6,bbbbb 3-1,ccccc 3-2,ccccc とBセルの値が 変わったタイミングで Aセルに管理番号が増えていくのですが Cells(1, 1).Resize(lastRow, 2).Value = resultの値を 表示せずに 2次元配列として resultの値を result = 結果(debug.print 結果) としてAセルの値を 1-1 1-2 1-3 2-1 2-2 2-3 2-4 2-5 2-6 3-1 3-2 と転記したいのですがアドバイスいただけたら助かります。 よろしくお願いいたします。

  • 連想配列を変数にする?

    こんにちは。 質問タイトルが変かもしれません。。。 xmlから受け取ったデータをphpで表示してます。 ・・・xmlデータの受取(?)は他社にお願いしており、私はphpでの表示のみなのでデータそのものは分かりません。 [aaaaa][bbbbb][ccccc][ddddd][depday] [aaaaa][bbbbb][ccccc][ddddd][cityname] [aaaaa][bbbbb][ccccc][ddddd][b][depday] [aaaaa][bbbbb][ccccc][ddddd][b][cityname] のように非常に長い連想配列があり、一番最後の[depday]と[cityname]は常に同じです。あまりにも長いので $hairetsu_1 = [aaaaa][bbbbb][ccccc][ddddd]; echo $hairetsu_1[depday]; echo $hairetsu_1[cityname]; $hairetsu_2 = [aaaaa][bbbbb][ccccc][ddddd][b]; echo $hairetsu_2[depday]; echo $hairetsu_2[cityname]; のように表示させる事は出来るのでしょうか? とんちんかんな質問だったらお許しください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • テーブル結合のSQL文について

    はじめまして、よろしくお願いします。 テーブルA、B、Cから情報を取得し、下記のSELECTイメージを表示させたいのですが、 どのようなSQLを記述すれば良いのかわからず、困っております。 どなたかご教示頂けますでしょうか。 SELECTイメージ  日付      キー  ------------ -------------  9/1      AAAAA  9/1      CCCCC  9/2      AAAAA  9/2      CCCCC  9/3      AAAAA  9/3      BBBBB  9/3      CCCCC  9/4      AAAAA  9/4      BBBBB  9/4      CCCCC テーブルA  日付      キー  ------------- -------------  8/31      AAAAA  8/31      CCCCC テーブルB  日付      キー  ------------ -------------  9/1      AAAAA  9/3      BBBBB  9/4      CCCCC テーブルC  日付  -------------   ・   ・   ・   8/31   9/1   9/2   9/3   9/4   9/5   9/6   ・   ・   ・

  • VBを2008を用いてCSVを取り込む ””で区切られていない数値混入

    VBを2008を用いてCSVを取り込む ””で区切られていない数値混入 文字列に,が含まれている場合がある。 題名どおりなのですが、以下のようなCSVファイルをVB2008で取り込もうと考えています。 "AAAAA",BBBBB,CCCCC,"DDDD,DDD","EEEEE","FFFFF" (同じアルファベットが本来同じ項目のデータ、BとCは0-9の数字のみ入ります またBCには常に””が含まれません。 Dは文字列なのですが、まれに「,」が含まれます) 下のものが現在使用しているソースですがsplitで「,」を指定しているので 当然Dが2つのデータとして認識されています。 BやCが””で囲まれていれば「”,”」で区切ればすむのですが一部が””なしなので どうやろうか迷っています。 実現したいこととしては ""なしの時は必ず、コンマまでが1つのデータ、 ""があれば""で区切られたデータが1つのデータとできればいいんですが。。。 以下ソースです。 ちなみにASPXファイルです。 (replaceDoubleQuotesというのは”を削除するための関数で無視していただいて結構です。 また以下のソースでは取り込み自体はせずにタイトル行がはいっているCSVファイルを弾く作業をしているのですが CSVからデータを取り出す作業は同じなので短いソースを使用させてもらっています) Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim Reader2 As New IO.StreamReader("C:\UploadedFiles\Uriage.txt", System.Text.Encoding.GetEncoding("Shift-JIS")) Dim Items2() As String 'CSVの各項目を表す配列 Dim Line2 As String = Reader2.ReadLine 'CSVの一行 Items2 = Line2.Split(",") Dim num_hantei As String = "^[0-9]+$" If Not (Regex.IsMatch(replaceDoubleQuotes(Items2(3)), num_hantei)) Then Dim objFSO As Object objFSO = CreateObject("Scripting.FileSystemObject") objFSO.DeleteFile("C:\UploadedFiles\Uriage.txt", True) objFSO = Nothing Label1.Text = "取り込みエラー。タイトル行がはいっている可能性があります。" Exit Sub End If Reader2.Close() End Sub Function replaceDoubleQuotes(ByVal apdata As Object) As String '文字列に変換する Dim tmp As String = String.Format("{0}", apdata) '1つのダブルクォーテーションを0個に置換する つまり消去する replaceDoubleQuotes = tmp.Replace("""", "") End Function

  • 3つ以上の外部結合から抽出するSQL構文

    次の3つのTABLEから期待する結果(結果を参照)を導きたいのですがJOIN等を使用しても期待と異なります。SQLを教えて下さい。結果は、SELECTでもVIEWでも構いません。一つのSQLでなくても構いません。 ●テーブル構成 テーブル名 - TB_A- -----TB_B--- ----TB_C----         ------ ------------- ------------- 列名     EMPNO EMPNO DATA1 EMPNO DATA2 レコード1   000001 000002 AAAAA 000001 AAAAA レコード2   000002 000002 BBBBB 000002 BBBBB レコード3   000003 000002 CCCCC 000003 CCCCC ●結果 列名     EMPNO DATA1 DATA2 レコード1   000001 ???????? AAAAA レコード2   000002 AAAAA BBBBB レコード3 000002 BBBBB ???????? レコード4   000002 CCCCC ???????? レコード5   000003 ???????? CCCCC

  • データの内容に1フィールド追加する方法

    以下のデータで、2003-6-30には、最後にOKを追加し、それ以外は、NGを追加し、データの更新を行いたいのですが、sedコマンドで可能ですか? 更新前 1 AAAAA 100 2003-6-30 2 BBBBB 200 2003-7-30 3 CCCCC 300 2003-8-30   ↓  ↓  ↓ 更新後 1 AAAAA 100 2003-6-30 OK 2 BBBBB 200 2003-7-30 NG 3 CCCCC 300 2003-8-30 NG

  • PHPでDBからデータを抽出してHTMLで表示する

    クライアント上で表示されているHTMLのテキストボックスに入力された文字列をホストに送信し、送信した文字列をSQLの抽出条件に設定してDB(MySQL)に登録しているデータ一覧をPHPで取得後、取得したデータ一覧をクライアントのHTMLのTABLEに一覧で表示したいのですが、どのようにPHPとHTMLをプログラムすればよいでしょうか? イメージ MysSQL テーブル カラム1|カラム2|カラム3| AAAAA|BBBBB|CCCCC| BBBBB|BBBBB|CCCCC| DDDDD|BBBBB|CCCCC| HTML テキストボックス カラム1「AAAA」 検索実行↓ HTML テーブル カラム1|カラム2|カラム3| AAAAA|BBBBB|CCCCC| AAAAA|BBBBB|CCCCC| 素人染みた質問で申し訳ございませんが、ご存知の方がいらっしゃいましたら終えてください。 以上

    • ベストアンサー
    • HTML
  • グループ化+最大値

    お世話になっております。GomiYasikiです。 以下のような場合で、フィールドAが同じ中のフィールドBが最大値のものを抽出する場合はどのようにすればよいのでしょうか? お手数ですが、宜しくお願い致します。 テーブル名:テーブルA フィールドA,フィールドB,フィールドC AAAAA,1,ABC AAAAA,2,XYZ BBBBB,1,ABC BBBBB,2,DEF CCCCC,1,AAA ↓結果 AAAAA,2,XYZ BBBBB,2,DEF CCCCC,1,AAA

  • 【VBA】ExcelマクロでCSVファイルに保存したデータが""で囲まれてしまう

    添付図のような、Excel2003で作成した表内のデータを CSVで保存するマクロを作成したのですが、 図のように、CSVファイルに「""」で値が囲まれた状態で、 保存されてしまいます。 下記にマクロを記載しますので、 どうすれば文字列が「""」で囲まれずに、 カンマ区切りだけのデータで出力されるのか、 ご存知の方おられましたら、ご教示お願い致します。 Sub csv保存() Dim フォルダ名 As String Dim パス名 As String Dim ファイル名 As String Dim データ As Variant Dim 行数 As Long, 列数 As Integer Dim i As Integer, j As Long, k As Long ファイル名 = "test.csv" フォルダ名 = "csv" パス名 = ActiveWorkbook.Path & "\" & _ フォルダ名 'csvフォルダが存在しなければ作成する If Dir(パス名, vbDirectory) = "" Then MkDir パス名 End If ChDir パス名 Open ファイル名 For Output As #1 For i = 1 To Worksheets.Count Worksheets(i).Activate Worksheets(i).Cells(1, 1).Select ActiveCell.CurrentRegion.Select 行数 = Selection.Rows.Count 列数 = Selection.Columns.Count For j = 1 To 行数 For k = 1 To 列数 - 1 データ = Selection.Cells(j, k) _ .Value Write #1, データ; Next k Write #1, Selection.Cells(j, 列数) _ .Value Next j Next i Close #1 End Sub

  • PHPでDBからデータを抽出してHTMLで表示

    こんにちは。 PHP初心者のものです。 クライアント上で表示されているHTMLのテキストボックスに入力された文字列をホストに送信し、送信した文字列をSQLの抽出条件に設定してDB(MySQL)に登録しているデータ一覧をPHPで取得後、取得したデータ一覧をクライアントのHTMLのTABLEに一覧で表示したいのですが、どのようにPHPとHTMLをプログラムすればよいでしょうか? イメージ MysSQL テーブル カラム1|カラム2|カラム3| AAAAA|BBBBB|CCCCC| BBBBB|BBBBB|CCCCC| DDDDD|BBBBB|CCCCC| HTML テキストボックス カラム1「AAAA」 検索実行↓ HTML テーブル カラム1|カラム2|カラム3| AAAAA|BBBBB|CCCCC| AAAAA|BBBBB|CCCCC| 素人染みた質問で申し訳ございませんが、ご存知の方がいらっしゃいましたら終えてください。 以上

    • 締切済み
    • PHP

専門家に質問してみよう