• ベストアンサー

CSVで可変のパラメータを並び変えたい

CSVで可変のパラメータを並び変えたい PartsName,Ref1,Ref2~Ref✳︎ PartsName、Ref1,Ref2~Ref✳︎は変数 これが複数行あり Refは1~200位迄あり可変です これを PartsName,Ref1 PartsName,Ref2 としたいです。 エクセルで行おうとしましたが、Refには読み込ますと勝手に数値変換されて指数表示されるのがあります。 例:631E25などです。 急ぎでしたいのですが、Refが可変なのでどうしたらいいのかとおもいまして。

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

  • ベストアンサー
  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.2

例えば、csvファイルで  PartsName1,Ref1,Ref2,Ref3  PartsName2,Ref4,Ref5,Ref6,Ref7 とあるのを  PartsName1,Ref1  PartsName1,Ref2  PartsName1,Ref3  PartsNema2,Ref4  PartsName2,Ref5  PartsName2,Ref6  PartsName2,Ref7 としたい、という事でしょうか。 エクセルのセルを経由すると自動変換されるという事なので、いっそエクセルを経由せずに作業してみましょう。 csvファイルの各行を文字列として取り込み、カンマで各値を分割、並べ替えた上で別ファイルに出力しています。 全て文字列で作業しており、セルに出力しないので、エクセルの自動変換はされません。 出力ファイル名などは適宜変更して下さい。 Sub SplitCSV()  Dim i As Integer  Dim buf As String, temp As Variant  Dim InputFileName As String '元のcsvファイル  Dim OutputFileName As String '変換後のファイル  InputFileName = Application.GetOpenFilename("CSVファイル,*.csv")  If InputFileName = "False" Then   Exit Sub  End If  OutputFileName = ActiveWorkbook.Path & "\SplitData.txt"  Open InputFileName For Input As #1  Open OutputFileName For Output As #2  Do Until EOF(1)   Line Input #1, buf '1行ずつ読み込み   temp = Split(buf, ",") '読み込んだ行をカンマで区切る   For i = 1 To UBound(temp)    If temp(i) <> "" Then 'parmが存在すれば     Print #2, temp(0) & "," & temp(i) 'Name及びParmを書き出し    End If   Next i  Loop  Close #1  Close #2 End Sub

Masayuki_Miki
質問者

お礼

回答ありがとうございます。 使わせてもらいます。 顧客から頂いた部品表で、部品をどこに使用するかがロケーション(Ref)、機械に入れるデータは、ロケーション(Ref)毎にどの部品を使うかが指定されてます。 部品表と機械に入れるデータを比較する必要があるのですが、具体的なデータを見せることは出来ません、顧客毎に部品名、ロケーションの付け方に特色があり、何処の仕様かわかってしまいます。 そのあたりは守秘契約してるので出来ません。 にもかかわらず、不明瞭な質問に回答くださりありがとうございます。 したいことは、まさに、その通りです。

その他の回答 (2)

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

可変、パラメーター、変数、変換、指数表示など、プログラム経験者らしい用語を使っていながら、質問文では、はっきり伝わらない。 プログラムマーなら、インプットとアウトプットを明確にするのは常識だろう。 データ例を4-5行分と、最終的に、なってほしい結果データを書いて、 注意事項を添えて書かないと。 ーー 勝手に想像してやってみる。 CSVデータをテキストエディタに表示し、全行Copyして、エクセルシートの (A1を貼り付け先の起点として)A列に張り付ける。 エクセルの「データー区切り位置ーカンマ」で各列に分離する。(VBAでもできるが手動操作で十分だろう) 分離したデータに対し、「名前ーREF」の組み合わせで、レコードを作る。 そして並べ替える、が趣旨と推測した。 標準モジュールに Sub test02() Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") k = 1 lr = sh1.Range("A10000").End(xlUp).Row 'MsgBox lr '-- For i = 1 To lr cr = sh1.Cells(i, 1000).End(xlToLeft).Column 'MsgBox cr For j = 2 To cr sh2.Cells(k, "A") = sh1.Cells(i, "A") sh2.Cells(k, "B") = sh1.Cells(i, j) k = k + 1 Next j Next i '---ソート 'MsgBox k - 1 Range(sh2.Cells(1, 1), sh2.Cells(k - 1, 2)).Sort key1:=sh2.Range("b1") End Sub を貼り付け、実行。 中間データ エクセルシート PartsName1 Ref1 Ref5 Ref3 PartsName2 Ref4 Ref2 Ref7 Ref6 PartsName3 Ref9 Ref8 最終データ PartsName1 Ref1 PartsName2 Ref2 PartsName1 Ref3 PartsName2 Ref4 PartsName1 Ref5 PartsName2 Ref6 PartsName2 Ref7 PartsName3 Ref8 PartsName3 Ref9 == CSVファイル関連は、予想外の事項もあるので、これで間違いなく正しいとは 思わないが、これで途中や結果のどこがおかしいかな。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.1

まず、CSVデータを普通に読むと、いろいろなパターンで変換されてしまいます。前ゼロや、指数表記が端的な例です。 変換されずに読むには、(Sheet1のA1からデータを貼り付け、Sheet2のA1から出力します) 1.CSVデータをテキストエディタで開き、全行コピーします。 2.Excelを開き、Sheet1のA1にコピーしたCSVデータを貼り付けます。 3.貼り付けたをデータ>区切り位置でカンマで区切る処理を実行します。   当然文字化けします。 4.結果を消去(削除より消去がいいでしょう)し、該当行を書式設定で   文字列にします。 5.クリップボードにはCSVデータが残っているので、再度貼り付けます。 これで誤変換なく取りこめたはずです。 つぎに、質問の >PartsName,Ref1 >PartsName,Ref2 >としたいです。 がよく分かりません。 例えば、 artsNameA,RefA1,RefA2 artsNameB,RefB1,RefB2,RefB3 ならば、 artsNameA,RefA1 artsNameA,RefA2 artsNameB,RefB1 artsNameB,RefB2 artsNameB,RefB3 にするとして、マクロを書いてみました。手作業ではこちらが面倒でしょう。 標準モジュールに貼り付けます。 Sub MakeData()  Dim ws1 As Worksheet  Dim ws2 As Worksheet   Set ws1 = Worksheets("Sheet1")   Set ws2 = Worksheets("Sheet2")  Dim rw1 As Long  Dim rw2 As Long  Dim col As Integer  Dim pName As String  Dim dt As String    With ws1.Range("A1")   pName = .Offset(rw1   While pName <> ""    dt = .Offset(rw1    While dt <> ""     dt = pName & "     rw2 = rw2 + 1          col = col + 1     dt = .Offset(rw1    Wend        rw1 = rw1 + 1    pName = .Offset(rw1   Wend  End With End Sub

関連するQ&A

  • CSVから値の割り出し2

    お世話になります、Perl初心者です。 先日、同じような投稿を投げているのですが、完全に仕様を勘違い していて、また助言をして頂きたく投稿しました。 サンプルを送ってくれたBLUEPIXY様、すみません。 まずやりたい事は、アンケートのフォームからPOSTされた データをCSVファイルに突き合わせて、値を割り出すという ことなんですが… <CSVファイルの例> 1,1,1,2,2,2,3,3,3 1,2,3,1,2,3,1,2,3 1:3,1:3,1:3,3,1:2,3,1,2:3,1,2:3 "1,3","1,3",2,1,"2,3",1,"1,3",2,2 "A","B","C","-","D","-","E","F","G" 行は、設問の数だと想定して下さい。上からQ1,Q2…のような 感じです。英字の部分は結果(出力)になります。 ◆1:3は、1,2,3のどの値が入ってもというのを意味します。 ◆"1,3"は、1か3のどちらかという意味です。 ◆"-"はNullです。 渡されるパラメータは数字の1~3まで、設問数分一気に送られて きます。例)1,2,1,2,3… 渡されたパラメータを元に、上から値(範囲)を絞っていって 結果を返します(英字) 例) パラメータ「2,2,1,3」(1行目,2行目…)  結果「D」 これは、1行目をパラメータ「2」に対してマッチさせて 「2,2,2」の範囲を得ます。2つ目も「2」なので、1行目 の範囲の中から、ヒットする数値を割り出します。 それ以降も同じ要領で、絞っていき結果を出します(英字) このサンプルCSVだと、結果は2行目で決まってしまうの ですが、本来はもっと行が多いです。 恥ずかしい話なんですが、grepをしたらいいのか、 posで位置を得たらいいのか、lengthでバイト数を測れば いいのか、いい方法が思いつきません。 カンマやコロンでの処理が出来るのかどうかも解りません。 どうか、ご教授願えないでしょうか?

    • ベストアンサー
    • Perl
  • パラメータの1つを複数行で表記する方法はありますか?

    grep で正規表現を使って、検索をしようとしています。 (例) grep -E -n '(AKABANE)|(IKEBUKURO)|(TOKYO)|(YOKOHAMA)' *.c 上記のような例でヒットする文字列を増やそうとしているのですが、 1行が長くなってしまいます。複数のパラメータであれば grep -E -n '(AKABANE)|(IKEBUKURO)|(TOKYO)|(YOKOHAMA)' \ *.c のようにして複数行で書くことができますが、パラメータの1つが 異常に長くなってしまう場合、これを複数行に分けることは 可能でしょうか?

  • CSVファイルを・…

    データが全角数字のCSVファイルを Excelで開いた場合に数値型に変換されるのですが それを回避する方法をどなたかお教えして頂けないでしょうか? Csvイメージ例 012345,12345,111 「'」を使えば回避できるのは知っていますが 「'」だと初期表示で「'」まで表示されてしまうので 「'」の使用はさけたいです。 お願いいたします。

  • phpで、可変項目のcsvデータを読み込みたい

    csvでデータを読み込む方法はネットで見つけたのですが、下記の条件を加えた場合どうすればいいか分かりません。 ネットで見つけた方法は、ファイルを1行ごと読み込み、コンマごとに区切って配列にいれる方法です。 しかし、項目が可変の場合、名前を入れたいところに別のデータが入ったりします。 【条件】 csvの項目名は、 A,B,C,D,E,F とする それぞれの項目は、省略可能(どこが省略されるか分からない) そのため、 A,D,E,F など、項目名が少ないCSVファイルもある。 こんな場合は、どのように処理をすればよいでしょうか? 実際は、項目名が50個ほどあります。 今回の例のように、少なければ何とかできそうなのですが・・・ 【補足・データファイル】 "A","B","C","D","E","F",←項目名 "山田","太郎","東京","15","123-221","男",←データ "山田","次郎","東京","13","124-567","男", ・・・・・・・・・↓続く ・・・・・・・・・

    • ベストアンサー
    • PHP
  • パラメータ

    パラメータ=媒介変数 x=t×1 y=t×2の場合のtの値 と言うのは分かったのですが 具体的な使用例がいまいちわかりません。 xy2つの数値が導き出されて具体的にどのように使われてどのように動くのか わかりましたら教えて下さい。

  • ExcelVBA CSV読込書き込み

    ExcelVBAです。Excelバージョンは2003,2007です。 CSVファイルを読み込み、書き換えて、別のファイル名で保存します。 一通りできるのですが、次の場合どの様にしたら良いでしょうか? CSVのデータ項目が、20桁ほどの数値、住所などの文字列、5桁ほどの数値となっています。 20桁ほどの数値は文字列扱いにしたいのですが、Excelでは指数表示になってしまいます。 そのままCSVとして保存すると指数で保存されてしまいます。 これを文字列として表示し、CSV保存でも文字列として保存したいのです。 よろしくお願いします。

  • excel vbaで複数のcsvファイルの読み込み

    100シート分のcsvファイルのデーターを一つずつ読み込んでexcelにコピーして使用してますが莫大な時間がかかって困ってます。 vbaを使用して作業を簡素化出来る事は出来ないでしょうか? ------------------------------------------ ※ csvの概要 excelで1枚のcsvファイルを開くとA列の11行目から65536行まで数値データがあります。 ※ vbaできたらよいなと思う仕様 そこで、複数のcsvファイルを選択して読み込むとCSV_データと言うSeetのA列の10行目から1枚目のcsvファイル、B列の10行目から2枚目のcsvファイルと言う風に選択した分のcsvを列に続けて数値データを貼り付けしてくれるvbaをご教授していただけると大変助かります。 不躾で申し訳ございませんが宜しくお願い致します。 excel2003 ------------------------------------------

  • 複数のCSVファイルを1つのファイルにまとめる方法

    EXCELで、あるフォルダ(例:Dir1)に格納されている複数のCSVファイルを読み込んで、そのファイルの1行目をコピーし、別ファイル(a.csv)にペーストしたいと思っております。 例えば、Dir1には1.csv,2.csv,3.csvの3つのCSVファイルが存在した時に、a.csvに出力されるのは、 ----------------------------------- 1.csvの1行目 2.csvの1行目 3.csvの1行目 ----------------------------------- となるのが、理想の形です。 方法を知っている方がいらっしゃったら お教えいただければと思います。

  • Excelで作成した表の数値がcsvで保存すると指数表示になる

    エクセルで16桁(12345678・・・)の数値入力した表(表示形式は文字列に設定)をCSVで保存すると、指数表示(8.86E+15)になりました。CSVで16桁の数値を表示するにはどうすれば良いですか?又いくつものセルの表示を同時に直す事は出来ますか?よろしくお願い致します。 OSはWinNT Officexp Personalです。

  • csvファイルで指数表現しないようにする方法

    アクセスデータをエクセルデータに、またエクセルデータをCSVデータに 変換する作業中にエクセルに変換した時点ですでに1E00032が 1E+32という形式になってしまいます。それをさらにCSVデータに変換しても変わらないです。本来はCSVデータに変換した時に1E00032の文字列が欲しいのです。いくら書式を文字列に変えても変わらないです。 皆さん、お願いいたします。

専門家に質問してみよう