アプリ版:「スタンプのみでお礼する」機能のリリースについて

CSVファイルの任意の列をダブルクォーテーションで囲みたいのですが・・・。
例えば
 abc,def,ghi,jkl
 mno,pqr,stu,vwx
    ↓
 abc,"def",ghi,"jkl"
 mno,"pqr",stu,"vwx"

というように、2番目と4番目の列の文字列をダブルクォーテーションで囲む、といった具合にです。
調べてみるとVBAを使用する方法はあるようですが、EXCELやその他のフリーソフト等を使用して処理する方法はありませんでしょうか。

よろしくお願いいたします。

A 回答 (4件)

原始的ですが、、



1.csvファイルとしてExcelで開く。
  拡張子がcsvであれば自動的に判別してくれます。
2.囲みたい列の前後に列を挿入する。
  質問者さんの例の場合、B,D,FとH以降が空白になる。
3.囲みたい列の前の列の全行に「あ」と入れる。
  囲みたい列の前の列の全行に「い」と入れる。
  (※ファイル内で使われていない文字を入れる。漢字でも記号でもいい。)
4.いったん、上書き保存し
  CSVのままでいいか聞かれるので「はい」を選ぶ。
5.Excelを閉じる。
  保存するか聞かれるが、保存しない。
6.更新されたcsvファイルをテキストエディタ(メモ帳等)で開く。
7.置換で「あ,」→「"」に、「,い」→「"」に置換する。

というので、どうでしょう。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
やりたかったことがバッチリできました。
スムーズにやる方法がないかばかり考えて、考え至りませんでした。
ありがとうございました。

お礼日時:2010/02/03 00:20

質問者の方は、レビューをしないようですが、もう少し考えてみました。



Wordで試してみましたが、通常では、ダブルクォーテーションが、2byte文字に変わってしまいます。それは、Wordでは、オートコレクトが働いていますから、それを外さなくてはなりません。また、CSVのファイル構造は、列数が決まったものに限りますね。行頭を意味するワイルドカードがあると良いのですが、見当たりません。Wordは、どうも完全に正規表現を表現できるようではありません。

マクロを考えてみました。マクロに対して使う前から否定的かだと、どうしようもありませんが、一通りのエラー処理はされています。
標準モジュールに貼りつけて起動すると、ファイルを選択するダイアログが働きます。以下は、バックアップモードはオフになっています。
'-------------------------------------------
'Option Explicit
Sub TestCSVChange()
  'CSVの列にダブルクォーテーションを入れるマクロ
  Const AIMEDCOL As String = "2,4" '数字を入れ、カンマで区切る
  Const BkMODE As Boolean = False 'バックアップモード = True
  Dim arCol As Variant
  Dim fName As Variant
  Dim fName2 As Variant
  Dim oFNum As Integer
  Dim iFNum As Integer
  Dim myArray As Variant
  Dim i As Long, j As Variant
  Dim buf As String
  Dim TextLine As String
  Dim Matches As Object
  Dim Match As Object
  Dim Tmp As String
  On Error GoTo ErrHandler
  arCol = Split(AIMEDCOL, ",")
  fName = Application.GetOpenFilename("CSVファイルl(*.csv),*.csv")
  If VarType(fName) = vbBoolean Then Exit Sub
  iFNum = FreeFile()
  Open fName For Input As #iFNum
  oFNum = FreeFile()
  Open "temp.csv" For Output As #oFNum
  
  Do While Not EOF(iFNum)
    Line Input #iFNum, TextLine
    If Len(TextLine) > 1 Then
      myArray = Split(TextLine, ",")
      For i = LBound(myArray) To UBound(myArray)
        j = Application.Match(CStr(i + 1), arCol, 0)
        If IsNumeric(j) Then
          buf = buf & "," & """" & myArray(i) & """"
        Else
          buf = buf & "," & myArray(i)
        End If
      Next i
    End If
    Print #oFNum, Mid$(buf, 2)
    buf = ""
  Loop
ErrHandler:
  Close #iFNum
  Close #oFNum
  If Err.Number = 0 Then
    'バックアップモード
    If BkMODE Then
      Tmp = Mid$(fName, 1, InStrRev(fName, "\")) & _
      "$" & Format$(Now(), "dhhmmss") & ".csv"
      Do
        If Dir(Tmp) = "" Then
          Name fName As Tmp
          Exit Do
        Else
          Tmp = Mid$(fName, 1, InStrRev(fName, "\")) & _
          "$" & Format$(Now(), "dhhmmss") & ".csv"
        End If
        DoEvents
      Loop
    Else
      Kill fName
    End If
    Name "temp.csv" As fName
    Beep
  Else
    MsgBox Err.Number & ":" & Err.Description, vbExclamation
  End If
End Sub
    • good
    • 0
この回答へのお礼

再度回答ありがとうございます。
VBAやマクロを使いこなせたら、と思うことがあります。

お礼日時:2010/02/03 00:27

csvファイルを開いてワードでワイルドカード置換するのが簡単かもしれません。



たとえば、2列目と4列目をダブルコーテーションで囲むなら、ワードでCtrl+Hで置換ダイアログを出して、「オプション」ボタンをクリックし、「ワイルドカード置換する」にチェックを入れ「検索する文字列に「(*,)(*),(*,)(*)^13」置換後の文字列に「\1"\2"\3"\4"^13」と入力して「すべて置換」します。

ちなみにエクセルで処理する場合は、csvファイルをエクセルで開いて、該当列のセルの書式設定で表示形式をユーザー定義にして「!"@!"」などにすればそのセルの値にダブルコーテーションを入れることができます。
これをcsvファイルで保存すると、そのテキストファイルはダブルコーテーションが3つ付いてしまいますので、上記の操作と同様に「"""」を「"」に一括置換することでも対応することができます。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2010/02/03 00:25

こんにちは。



正規表現のテキストエディタで置換すればよいのと思います。Excel のVBAよりは簡単かな?

検索値:^([^,]*),([^,]*),([^,]*),([^,]*)

置換値:$1,"$2",$3,"$4"

なお、
 abc,,ghi,jkl,abc,def,ghi,jkl
こういう場合は、
 abc,"",ghi,"jkl",abc,def,ghi,jkl

となります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
正規表現はあまり理解できてないので、機会があれば勉強してみようと思います。
挙げていただいた例をそのままやってみましたが、例の通りの結果は得られませんでした。
やり方が間違ってるのでしょうね。

お礼日時:2010/02/03 00:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています