[[20080217023049]] 『CSVからEXCELそして再度CSVでエラー』(EXCELじいさん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『CSVからEXCELそして再度CSVでエラー』(EXCELじいさん)Excel2007
 いつも勉強させていただいております。
CSV関係の過去ログは一応全て検索したつもりですが、現在問題が発生してしまった状態なので何とかお力をお借りしたいと思います。

 @システム側から商品マスター61列×2万行ほどのデータがcsv形式で保存されたものを開き
 1列目のJANコード13桁が4.52E+12の指数表示になっているのをセル書式で一度「文字列」に設定し、
 再度「数値」に設定し直し、Excel2007で保存しました。
 Aこの表を開き、在庫数量を修正入力して保存した状態です。
 BこのExcelデータをcsv形式で保存してシステム側へ読み込ませたらエラーが発生しました。
システム側担当者はテキスト形式でないからエラーが発生した、と言うので
 C、Aの表の1列目のJan13桁の書式を「文字列」に設定して上書き保存してから
 D、再度csv形式で保存するときにエラーメッセージ「CSV(カンマ区切り)と互換性のない機能がふくまれている可能性があります」
 →「この形式でブックを保存しますか」→「はい」で保存したcsv形式Dの1列目は書式を確認すると指数となっており、
 データは全て下7桁が0000000となってしまいます。
 正しい13桁の内容が反映したcsv形式のデータにして読み込ませるための修正手順がありましたらご教示ください。

 データ修正を行っているのでAの状態より前には戻せません。
 @の文字→数値はいつもvlookupなどで使うためこのように設定の癖。

これは、簡単に言えば、入力データのCSV形式とExcelで保存した時のCSV形式が

微妙に違っているのでしょうねえ!!

まず、

1 「データがcsv形式で保存されたもの」ですが、

このファイルのファイル名の拡張子は何ですか? CSVですか? TXTですか?

市販の販売管理等では、最近は「TXT」が多いようですねえ!!

2 商品マスターなら、商品名 や 単位 等の 文字列の列(項目)もあると思うのですが、

これらは、Excelに入力前のデータは、"(ダブルコーテーション)で囲まれているが、

Excelで保存したCSVファイルには、"で囲まれていない なんてことはありませんか?

3 商品コードなどは、Excelに入力前のデータは、仮にコードが8桁の場合は、00000001

というデータが、Excelで保存後は、1になっていて、これがそのシステムに入れ込む場合に

引っかかっている なんてことはありませんか?

この種のシステムは、データの受け入れのチェックは厳しいですよ!!

他にも 実は、カンマ区切りではなく、Tab区切りだったりして・・・。

Excel入力前のデータと保存後のデータをよく確認してみてください。

ichinose


追伸

*** データ修正を行っているのでAの状態より前には戻せません。

とありますが、これは、システム側から吐き出されたCSV形式のファイルが存在しないと

ということですか?

だとしたら、データの受け入れの仕様を確認するしかないですよ!!

Excelでcsvデータを扱う場合は、入力前のデータと保存後では何も変更せずに保存しても

内容が変更される可能性はあります。

商品マスターなら 再度システム側から、

CSVファイルを作成してもらえばよいと思いますが、

何か事情があるのでしょうか?

ichinose


 > @システム側から商品マスター61列×2万行ほどのデータがcsv形式で保存されたものを開き

 Excelで直接開かないで、下記で転記してみては?

 Private Const fn As String = "c:\test.csv"  '<- 要変更

 Sub myImport()
 Dim txt As String, x, y, a(), maxCol As Integer, n As Long
 Dim i As Long, ii As Integer
 txt = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\ファイル名.csv").ReadAll
 x = Split(txt, vbCrLf)
 ReDim a(1 To UBound(a) + 1, 1 To Columns.Count)
 For i = LBound(x) To UBound(x)
     n = n + 1 : y = Split(x(i),",")
     For ii = LBound(y) To UBound(y)
         b(n,ii + 1) = y(ii)
     Next
     maxCol = Application.Max(maxCol, ii)
 Next
 With ThisWorkbook.Sheets(1)
     .Cells.Delete
     With .Range("a1").Resize(n,maxCol)
         .NumberFormat = "@"
         .Value = a
     End With
 End With
 End Sub

 Sub CreateCSV()
 With ThisWorkbook.Sheets(1)
     With .Range("a1").CurrentRegion
         For i = 1 To .Rows.Count
             txt = txt & vbCrLf & _
                   Join(Evaluate("transpose(transpose(" & .Rows(i).Address & "))"),",")
         Next
     End With
     Open Replace(fn, ".csv", "Fixed.csv") For Output As #1
         Print #1, Mid$(txt,2)
     Close #1
 End With
 End Sub
 (seiya)

 seiya様、ichinose様 お手数をお掛けしてしまい申し訳ありません。
 システム側からのCSVはプロパティでは「Microsoft Excel CSVファイル」の種類になっており、
 いつも開いたときはエクセル画面の行列にちゃんと表示されていますが、
 どうしても一行目の商品コードがいつも指数表示になるのを13桁が表示されるように
 「文字列」→再度「数値」に直しているものです。
 seiya様のモジュールを実行しても同じように表示されます。
 (違いは日付が元は2006/8/29 0:00が38959に変化していることだけです。)
 1列目の13桁はどちらも同様に4.52283E+12と指数表示になります。
 実は作業内容は棚卸数量を入力(Excel画面で)したものを再度システム側に
 (csv形式に戻し)吸上げ在庫更新を行うステップ上でのトラブルです。
 もし@の段階での「文字列」→「数値」が間違いならば、
 @の状態で「文字列」設定だけで保存したCSVファイルに、
 そこにエクセルで棚卸入力したデータ部分のみを貼り付けてから、csv形式で吸上げを試行してみようと思います。
 明日、通常のシステムが動く前に処理を完了しなければならず焦っており、ご迷惑をお掛けしました。
 ありがとうございました。


 よく分かりませんが
 そもそも
 >1列目のJANコード13桁
 は、どの様なものなのですか?

 取り出した段階で数値なのでしょうか?
 それとも、取り出した時は文字列だが
 エクセルで開いた段階で数値になっているのでしょうか?

 これは、ichinoseさんの言っておられる3番と
 同じ事の確認です。

 どの様な事を言っているのか分からなければ
 次のことを試してみてください。

 1.エクセルのA列の書式設定を文字列にする
 2.A1に「001」A2に「002」A3に「003」と入力
 	[A]
  [1]	001
  [2]	002
  [3]	003
 3.そのシートを名前を付けて、CSV形式で保存。
 4.該当ブックを終了。
 5.保存したCSVファイルをダブルクリックで開く。

 すると、
 	[A]
  [1]	1
  [2]	2
  [3]	3
 となると思います。

 次に
 保存したCSVファイル上で右クリック
 プログラムから開く(H)から、Notepadを選び開いてみてください。
 Notepadでは「001」「002」「003」
 と表示されていると思います。

 本来は先頭に00が付いているデータなのに
 エクセルで開いた段階で無くなり
 数値になっている事が分かると思います。

 これを文字列に直して、保存しても
 データは「1」「2」「3」となるだけで
 「001」「002」「003」の状態には戻りません。

 エクセルで開いた時に、数値と見なされてその様に変換されているなら
 そもそも変換されないような開き方が必要になってくると思います。
(・・・それでも、取り込める保証は有りませんが・・・。)

 取り出した段階のCSVファイルはすでにないのですかね?

 上でも書いていますが、コードに0から始まる物が無いのなら
 文字列に変更しなおし、CSV形式で保存しただけの物で良いかもしれませんが
 0から始まる物が有る場合は、
 数値に変更された段階で先頭の0が無くなっている可能性があります。
 (13桁に満たないので 取り込み時にちゃんとはねられそうですが・・・。)
 そのあたりはしっかりご確認の上、取り込み作業に移るのが良いと思います。

 (HANA)

 HANA様ありがとうございます。
 過去ログの”
[[20031201160609]] 『CSVファイルの読み込みについて』(ふうせん) 
 のふうせんさんの状況と同様の状態です。

 私の場合は13桁ですので、例えば4522830123456というJAN13桁が@のEXCEL
 CSVファイル形式ではセルをクリックすれば数値は4522830123456と見えるのですが、
 表示は4.55283E+12と指数表示になります。EXCELで作業するにはこれを数値が表示される必要があるためにセルを
 「文字列」に設定して、「数値」にして棚卸数量を入力しました。
 次にこれをCSV形式で保存してシステムに読み込ませるときに1列目のJANを確認すると全データが4522830000000に化けてしまいます。
 @の手順が間違っていると思われるので、元のCSVファイルのJAN13桁の1列目だけ単に
 「文字列」に書式を設定して保存した別ファイル(CSV)にエクセル側で棚卸数量を入力した部分だけコピーしてから
 それをCSVファイルで上書き保存してからシステム側に読み込ませる暫定策をトライしてみようと思っております。
 お手数をお掛けしました。ありがとうございました。


 61列有るのなら、他の列に関しても同じ事になっているかもしれません。
(他の列は数値と誤認される様な文字列は無いのですかね?)
 その様な列は全て文字列で開くのが良いと思いますが・・・。

 ん〜、どう読んでも順序が違う気がするのですよね。
(私の読みが違っているだけなら良いのですが・・・。)

 先の私の書き込みは読んで頂けていますか?
 1.CSVを開く
 2.セルの書式を文字列に変更する
 3.CSVで保存する
 では、駄目な可能性が有ると言っているのですが・・・。

 ・・・まぁ、上手く行くかもしれませんし
 「文字列として開く」をやった所で
 上手く行かないかもしれませんけどね。

 (HANA)

 HANA様 何度もすみません。
 システム画面の商品検索画面(商品マスター)から全件検索でCSV形式で保存の画面があって、
 随時CSVファイルをマイコンピュータのCドライブに落とすことができるようになっています。
 普通は指数表示のA列のみ「文字列」→「数値」に書式を変更してEXCELで保存したファイルを使って
 vlookup関数でロケーション調べとか現在庫数一覧とかカートンの入り数をチェックするリスト作成などのEXCEL作業をしています。
 (再度CSVで吸上げる必要がないので何も問題は起きていませんでした)
 CSVのファイルをCドライブで見るとアイコンは「X a,」と表示されています。エクセル画面でこのA列の書式は「標準」となっております。
 今気づきましたが、元のCSVファイルは残っておりますし、再度同じCSVファイルを作ることは明日の朝までは可能です。
 従って、そのファイルはA列を「文字列」に設定し直すとかせず、そのままで棚卸数量だけをEXCELファイルから転写してみて、
 その上書き保存したCSVファイルをシステム側に読ませてみます。

 >ん〜、どう読んでも順序が違う気がするのですよね。
 HANAさまの仰る順序が違うという意味がよく理解できませんでした。
 すみません。


 出来るかどうか分からない事をこれ以上主張するのはどうかと思いますので
 これで最後にしようと思いますが
 >どの様な事を言っているのか分からなければ
 >次のことを試してみてください。
 は、試して頂けたのですかね?

 エクセルが勝手に数値に変更して
 先頭の0が無くなってしまった物は
 セルの書式設定を文字列にしただけでは
 付加されません。
 ですから、エクセルが勝手に数値に変更しないように
 「ここはそのまま取り込んで!!」と言いながら
 取り込む必要があると思います。
[[20070723133748]]『画面初期設定はどこで設定するの?CSVファイルの先頭ゼロが削除されないようにしたい』(miki)
 これは、A列だけに関する事ではなく その他のエクセルが
 勝手に数値にして仕舞いそうな列全てに関して言えると思います。
(例えば、日付が「080218」で取り出されていれば ここも文字列指定しておかないと
 「80218」に変わってしまいます。
  A列しか気にして居られない様ですが、その他の列は大丈夫ですか?)

 元のCSVが有るのなら、
 全列を文字列として開き
 変更したい列のデータ部分に、既に作成済みのデータを貼り付け
 CSV形式で保存
 と言うのを試しにつくっておいても良さそうな気がします。

 ただ、(EXCELじいさん)さんのなさろうと思っている方法で
 問題なく出来るかもしれませんので、頑張ってみてください。

 (HANA)

 >JANコード13桁が4.52E+12の指数表示
日本のコード45ではじまる13桁なので先頭に0が入ってることはなさそうですね。

 >7桁が0000000となる
保存時に7桁目以降が失われています。
指数表示のものをそのままcsvで保存すると下位の数値はなくなります。
CSVで保存すると見たままに近い形で保存されるようです。
セル幅6桁分の数値のみ残っているので、CSVで保存される際、
セル幅2.5〜3倍広くするとどうですか?

(くぁ)


 HANA様、夜遅くまでのご回答をいただきありがとうございます。
 >次のことを試してみてください。
 は試しましたし、このことは理解しているつもりです。
 システム側が作成したCSVファイルは自動的にEXCEL画面で開らくようになっているので
 「全列を文字列として開く」ことはできませんが、いつもEXCEL画面(正確にはEXCEL CSV)で開いても日付の部分は日付で表示されており
 商品名の部分は文字で表示されております。問題点はA列のJAN13桁が表示上「指数表示」となっていることだけです。
 激励ありがとうございます。がんばってみます。おやすみなさい。

 くぁ様 
 ヒントありがとうございます。

 明朝試してみます。 


 CSVでも「取り込み」から開くと 列の書式の設定は出来るのですけどね・・・。

 くぁさんの
 >日本のコード45ではじまる13桁なので先頭に0が入ってることはなさそうですね。
 と
 >問題点はA列のJAN13桁が表示上「指数表示」となっていることだけです。
 と言う事なら、私も寝ることにします。(笑)

 明日上手くいくと良いですね。
「でけました〜!!! 」って書き込みをお待ちしております。

 (HANA)

 すみません、読み落としてました。
>C、Aの表の1列目のJan13桁の書式を「文字列」に設定して上書き保存
文字列に設定したとき、JANコード部分が指数表示になる様でしたら
csvでは指数表示そのままの文字列で保存されます。

 文字列に設定せず、数値のままcsvで保存してみてください。

 ご存知とは思いますが、最初指数表示になるのは、データに対してセル幅が狭いためです。
ノートパッドやテキストエディタなどでCSVファイルを開いて見ると保存されている内容が違うのがわかりやすいです。
間に合いますように〜
(くぁ)

 EXCELじいさんさん
 myImport を実行した時点でA列がそのような形になっているのですか?
 文字列を文字列形式のセルに表示させるわけですので、そのようなことは
 ないと思いますが?
 Text editor 等で直接開くとどのような形になっていますか?
 (seiya)

 出来ました。解決しました。ありがとうございました。
 seiya様、すみません。私の返事はあくまでEXCELの世界でのお答えにしかなっておりません。
 元のCSVをText editorで開けば中身はちゃんと13桁表示されています。
 いづれにしましても、システム側が用意しているのは商品検索画面でEXCEL(CSV)というボタンを押すと
 マイコンピュータのCドライブに「X a,」というアイコンで「商品M」のCSVファイルが作成されるところからのスタートとなります。
 この「商品M」をダブルクリックするとエクセル画面になります。
 A列JAN13桁の書式は「標準」表示は「4.52283E+12」中身は「4522830123456」です。
 この状態から
 JA列書式を「文字列」に設定して CSVファイルで保存すると 書式は「指数」表示は「4.52E+12」中身は「4522830000000」
 KA列書式を「文字列」に設定して EXCELファイルで保存すると 書式は「文字列」表示は「4.52883E+12」中身は「4522830123456」
 LA列書式を「文字列」にしたあと、再度A列書式を「数値」に再設定して、CSVファイルで保存すると 書式は「標準」表示は「4.52283E+12」中身は「4522830123456」
 MA列書式を「文字列」にしたあと、再度A列書式を「数値」に再設定して、EXCELファイルで保存すると 書式は「数値」表示は「4522830123456」中身は「4522830123456」
 NこのMのA列が「数値」設定のEXCELファイルに在庫データを入力して、CSVファイルで保存すると
  書式「標準」表示「4.52283E+12」中身は「4522830123456」
 Oもし上のKのA列が「文字」設定のEXCELファイルを CSVファイルで保存すると、書式は「指数」表示は「4.52E+12」中身は「4522830000000」

 通常はMの手順でEXCELファイルを作成します。
 再度CSVにはNを行っているつもりなのですが、時々出来上がったファイルの中身が
 4522830000000になるので、時間に追われているときは頭がパニックになります。今回も何故かこの状態になってしまいました。
 EXCELヴァージョンは2007です。NのCSVファイルを作るとき「名前を付けて保存」のあとファイルを閉じる時、
 再度「.CSVファイルを保存しますか?」で「いいえ」だとOKみたいですが「はい」を押すと4522830000000が作られておかしくなるみたいでどうもこれが私の間違いの原因だろうと思っています。
 Ichinose様、seiya様、HANA様、くぁ様 お力添えありがとうございました。
 振り回してしまいまして申し訳ありません。何とか日常業務にシステムを復帰できました。
 ありがとうございました。


 1) myImport で Excelに CSV データを読み込む
 2) データを編集
 3) 編集したデータをCreateCSVで再度CSVファイルを作成
 4) TExt editor で確認
 という動作になります。
 (seiya)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.