ここから本文です

データ処理の質問です。

ega********さん

2017/12/2517:47:15

データ処理の質問です。

csvファイルに
点番号, 接続先番号
0,0
1,5
2,2
4,2
5,4
・・
・・
となっているのですが、この点番号を連続した番号にし、接続先の番号も対応して変更させたいです。
例 表では3が抜けているので4→3、5→4に置換したい。
どうすればいいでしょうか?
プログラムを書いていただけるとありがたいです。

補足0.0
1.4
2.2
3.2
4.3
となるようにしていただきたいです。

閲覧数:
67
回答数:
2
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

lin********さん

2017/12/2522:10:24

こういうことでしょうか?

0,0
1,5
2,2
4,2
5,4

が、

0,0
1,5
2,2
3,2
4,4

になりました。

「VBScript」による回答ですので、「Windows限定」です。

このプログラムは、これから処理したい「csv」ファイルを1つだけ、プログラムファイルに、ドラッグ&ドロップするだけです。

最後に「Finished!」と表示しますので、「OK」を押して、終了してください。

今回のファイルでは、たとえば、「Test.csv」というファイルをドラッグ&ドロップすると、いったん、同じフォルダ内に「Test.xyz」というファイルを作成し、「Test.csv」ファイルから1行ずつ、読み込みながら、「Test.xyz」に書き込み、最後に、「Test.csv」ファイルを削除し、「Test.xyz」のファイル名を「Test.csv」に直す、という処理を行っています。

以下のプログラムを、メモ帳かテキストエディタに貼り付け、「~.vbs」という名前で保存します。

「~」の部分は、何でもかまいませんが、「.vbs」の部分は、必ず半角です。

できたプログラムファイル(「~.vbs」ファイル)に、これから処理したい「csv」ファイルを1つだけ、ドラッグ&ドロップしてください。

Option Explicit
Dim a, c, cv, cx, f, n, so, wa, x
Set so = CreateObject("Scripting.FileSystemObject")
Set wa = WScript.Arguments
If wa.Count <> 1 or LCase(so.GetExtensionName(wa(0))) <> "csv" Then
MsgBox("ドラッグ&ドロップできるのは、csvファイル1つだけです")
WScript.Quit
End If
f = so.GetParentFolderName(wa(0))
n = so.GetBaseName(wa(0))
c = -1
Set cv = so.OpenTextFile(wa(0), 1)
Set cx = so.OpenTextFile(f & "\" & n & ".xyz", 2, True)
Do Until cv.AtEndOfStream
a = Split(cv.ReadLine, ",")
c = c + 1
cx.WriteLine c & "," & a(1)
Loop
cv.Close
cx.Close
Set cv = Nothing
Set cx = Nothing
so.DeleteFile wa(0), True
Set x = so.GetFile(f & "\" & n & ".xyz")
x.Name = n & ".csv"
Set x = Nothing
Set wa = Nothing
Set so = Nothing
MsgBox("Finished!")

簡単な説明です。

Option Explicit

「厳密に」というような意味ですが、気にしないでください。

Set so = CreateObject("Scripting.FileSystemObject")

ファイルやフォルダを扱えるようにしていますが、今回は特に、「csv」ファイル(テキストファイル)を扱うのにも必要です。

Set wa = WScript.Arguments
If wa.Count <> 1 or LCase(so.GetExtensionName(wa(0))) <> "csv" Then
MsgBox("ドラッグ&ドロップできるのは、csvファイル1つだけです")
WScript.Quit
End If

ドラッグ&ドロップされるのを待っていて、ドラッグ&ドロップされると、ファイルの数や拡張子を調べ、想定外なら、メッセージを表示して、プログラムそのものを終了してしまいます。

f = so.GetParentFolderName(wa(0))

ドラッグ&ドロップされたファイルの存在するフォルダを調べています。

n = so.GetBaseName(wa(0))

ドラッグ&ドロップされたファイルのベースネーム(「abc.csv」→「abc」)を調べています。

c = -1

カウント用変数の初期化。

Set cv = so.OpenTextFile(wa(0), 1)

どらっぐ&ドロップされたファイルを「読み込み専用」で開いています。

Set cx = so.OpenTextFile(f & "\" & n & ".xyz", 2, True)

同じフォルダ内に「abc.csv」なら「abc.xyz」というファイルを、「書き込み専用」で、新規作成しています。

Do Until cv.AtEndOfStream

ファイルの終端まで処理。

a = Split(cv.ReadLine, ",")

1行読み込んで、「,」を区切り記号として、配列変数に格納します。

すなわち、読み込んだ1行が「0,1」なら「a(0) = "0"」、「a(1) = "1"」としています。

c = c + 1

1カウント。

cx.WriteLine c & "," & a(1)

左端は、「c」、右側は、元の値を書き込んでいます。

Loop

を、ファイルの終端まで繰り返しています。

cv.Close
cx.Close
Set cv = Nothing
Set cx = Nothing

両ファイルを閉じています。

so.DeleteFile wa(0), True

元のファイルを削除しています。

Set x = so.GetFile(f & "\" & n & ".xyz")

ファイル名を変更するために、「xyz」の方を取得しています。

x.Name = n & ".csv"

ファイル名を変更しています。

Set x = Nothing
Set wa = Nothing
Set so = Nothing
MsgBox("Finished!")

あとは、終了処理で、最後に「Finished!」と表示しています。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この質問は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

dia********さん

2017/12/2520:00:22

2レコード目は

1,4

にはならないのか?

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる