ExcelがおいしいCSVファイルを食べて不要なデータを排出するのを止めるにはどうすればよいですか?


128

シリアル番号でウィジェットの販売を追跡するデータベースがあります。ユーザーは購入者のデータと数量を入力し、各ウィジェットをカスタムクライアントプログラムにスキャンします。その後、注文を確定します。これはすべて完璧に機能します。

一部の顧客は、購入したウィジェットのExcel互換のスプレッドシートを求めています。データベースをクエリし、ストア名と関連データを含むCSVとして結果を出力するPHPスクリプトでこれを生成します。これも完璧に機能します。

メモ帳やviなどのテキストエディターで開くと、ファイルは次のようになります。

"Account Number","Store Name","S1","S2","S3","Widget Type","Date"
"4173","SpeedyCorp","268435459705526269","","268435459705526269","848 Model Widget","2011-01-17"

ご覧のとおり、シリアル番号が存在し(この場合は2回あり、すべてのセカンダリシリアルが同じではありません)、番号の長い文字列です。このファイルをExcelで開くと、結果は次のようになります。

Account Number  Store Name  S1  S2  S3  Widget Type Date 
4173    SpeedyCorp  2.68435E+17     2.68435E+17 848 Model Widget    2011-01-17

お気付きかもしれませんが、シリアル番号は二重引用符で囲まれています。Excelは.csvファイルのテキスト修飾子を尊重しないようです。これらのファイルをAccessにインポートするとき、難易度はゼロです。それらをテキストとして開くとき、まったく問題ありません。しかし、Excelは必ずこれらのファイルを無駄なゴミに変換します。既定ではないアプリケーションでCSVファイルを開くという方法でエンドユーザーに指示しようとするのは、面倒なことです。希望はありますか?見つけられなかった設定はありますか?これは、Excel 2003、2007、および2010の場合のようです。


46
名前だけに+1を付けることはできますか?
tombull89

11
Excel does not seem to respect text qualifiers in .csv files-二重引用符はテキスト修飾子ではありません。データでカンマを使用できます。データでコンマを使用しない場合は意味がありません。Excelは、あなたの大規模なシリアル番号があることを推測することができるようにCSVファイル内のすべてのデータは、型なしで、そしてあなたは、Excelのに実行したとき、それはだ最大精度あなたの数字を切り捨てているものである15桁の、。
DMA57361

1
Excelは、二重引用符内のすべてのコンマを尊重しているようには見えません。「2012年8月12日」を考慮して、Excelもそれをゴミに変えます。
zundarz

5
私はこのSUの質問に言及したいと思います。ExcelでCSVを処理するときに使用できるオプションについて説明します。
-nixda

1
@nixdaありがとう!これらは、特に経験豊富なユーザーにとって有用な提案です。私の問題はほとんど人間の問題です。Excelは.csvファイルに関連付けられ、人々はアイコンを見て、ダブルクリックします(これはあなたが物事を開く方法だからです)。それらを保存します!)、すべてが失われます。ただし、可能な場合は必ずメソッドを使用します。
アトルーン

回答:


58

しかし、Excelは必ずこれらのファイルを無駄なゴミに変換します。

Excelは無駄です。

解決

Excel形式のデータを必要とするクライアントが、これらの3つの列の表示形式を小数点以下の桁数がゼロの「数値」または「テキスト」に変更できなかった場合、少し驚きます。しかし、短いハウツー文書は問題外であると仮定しましょう。

オプションは次のとおりです。

  1. シリアル番号に空白文字ではなく非数値を投げます。
  2. デフォルトのフォーマットでxlsファイルまたはxlsxファイルを書き出します。
  3. これらの数値をチートして数式として出力します="268435459705526269","",="268435459705526269"="268435459705526269",,="268435459705526269"2文字を保存することもできます)。これには、正しく表示されるという利点があり、おそらく一般的には有用ですが、微妙に壊れています(式であるため)。

オプション3には注意してください。一部のプログラム(ExcelおよびOpen Office Calcを含む)は、=""フィールド内のコンマをエスケープされたものとして扱わないためです。つまり、="abc,xyz"2つの列にまたがってインポートが中断されます。

の形式を使用"=""abc,xy"""するとこの問題は解決しますが、Excelの数式の長さの制限により、この方法でも255文字に制限されます。


1
実際、それは厳しいことではありません。上記の数値のいずれかをコピーしてExcelに貼り付け、提案に従って数値形式を変更します。Excelは値を変更し、結果としてゴミになります。
ジョーインターネット

1
@ジョー、私は最初の概要にあまりにも大雑把だった。Excelは実際にゴミを生成し、それ自体がゴミです。それを反映するように回答を更新しました。オプションには、「Excel csv」と「使いやすい、価値のあるcsv」があります。
タイラー

2
@Tyler-Excelがゴミだとは思わない。OPはこの場合ゴミを生成していると言っただけだ。実際には非常に良い質問ですが、一見エレガントなソリューションはありません。
ジョーインターネット

1
[セルのフォーマット...]オプションが提案されており、使用しようとしました。この場合、ファイルを開くと、Excelはシリアルを科学表記法に変換し(同意し、予想外ではない)、精度を上げているようです。それらを数字またはテキストに変更しても、文字列は返されません。 それが本当に問題の本質です。数式として出力することでも可能ですが、それについては考えていませんでした。
アトローン

9
@ DMA57361動作は予期されていません。決定可能です。数値の精度は十分に文書化されていますが、ExcelがCSVを読み取る方法はそうではありません。警告がなく、データを静かに破棄するのはばかげています。データをインポートする方法をExcelに伝えることさえできないという事実は、同様にばかげています。否定性は必要ですか?いいえ、しかし正直は最高のポリシーであり、それが私が感じる方法です。
タイラー

42

同様の問題があり、3-5などの範囲を含む列を含むCSVファイルがあり、Excelはそれらを常に日付に変換します。たとえば、3-5は3月で、その後数値に戻すと無効な日付整数になります。私たちはそれを回避しました

  1. CSVからTXTへの拡張子の変更
  2. 次に、Excelで開くと、テキストインポートウィザードが起動します
  3. ウィザードのステップ3/3では、問題の列がテキストであり、適切にインポートされていることを伝えました

ここでも同じことができると思います。

テキストインポートウィザード

乾杯


2
正しい方法であるため+1。(編集:申し訳ありませんが解決策を明確にするために少し編集しなければなりませんでした)
ジェイ

2
ファイルの名前を変更する必要はありません。インポートウィザードを使用して、Shiftキーを押しながらすべての列を選択し、テキストとして選択します。
-nixda

1
テキストインポートウィザードがその答えです。他のすべてのソリューションは、Excelを使用してCSVを表示および編集する方法を理解していないため、不必要なハッカーです。
Excellll 14年

1
@Excellll、一度に1ファイルずつ実行します。このプロセスを自動化するとき、「不要なハッカー」は多くの場合、1日を節約します。
パリッシュ夫

1
標準ユーザーがCSVファイルを表示するためにExcelを使用する場合、これはまったく役に立ちません。text-import-wizardを15人の初心者スキルのオフィスユーザーに使用する方法を説明する前に、Excelドキュメントのソースコードを自分で入力します。
ノースキルドナン

8

より良い解決策は、XML Workbookを生成することです。このような:

<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
  </OfficeDocumentSettings>

  <ss:Worksheet ss:Name="Sheet 1">
    <Table>
    <Column ss:Width="100"/>
    <Column ss:Width="100"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="80"/>
    <Column/>

    <Row>
      <Cell><Data ss:Type="String">Account Number</Data></Cell>
      <Cell><Data ss:Type="String">Store Name</Data></Cell>
      <Cell><Data ss:Type="String">S1</Data></Cell>
      <Cell><Data ss:Type="String">S2</Data></Cell>
      <Cell><Data ss:Type="String">S3</Data></Cell>
      <Cell><Data ss:Type="String">Widget Type</Data></Cell>
      <Cell><Data ss:Type="String">Date</Data></Cell>
    </Row>

    <Row>
      <Cell><Data ss:Type="String">4173</Data></Cell>
      <Cell><Data ss:Type="String">SpeedyCorp</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">x</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">848 Model Widget</Data></Cell>
      <Cell><Data ss:Type="String">2011-01-17</Data></Cell>
    </Row>


    </Table>
    <x:WorksheetOptions/>
  </ss:Worksheet>
</Workbook>

ファイルには.xml拡張子が必要です。ExcelとOpenOfficeが正しく開きます。


OPはPHPスクリプトを使用してデータベースをXML形式に変換する必要があるということですか?
プラサナ

2
ユーザーがExcelで.csvを開いたりCSVを台無しにしたりするよりも、ExcelだけがCSVを理解できるようにすっきりしています。それほど複雑なスキーマでもありません。
ビンキ

この規格はどこに文書化されていますか?利用可能なデータ型についてもっと知りたいです。
ジョンドハティ

1

私の解決策:シリアル番号のインポートで同じ問題が発生しました。それらは数字として扱われる必要はありません。つまり、数学関数は実行されませんが、数字全体が必要です。私が持っている最も簡単なことは、シリアル番号にスペースを挿入することです。例:「12345678 90123456 1234」。Excelがインポートすると、数値ではなくテキストとして扱われます。


0

長いアカウント番号が文字化けしていました。

これは私がそれを修正した方法です:

Libre Office / Open Officeでfile.csvを開き(区切り文字などを指定する必要がある場合があります)、Excel XMLファイルとしてファイルを保存します。

次に、このファイルをExcelで開くと、列が科学形式などに変更されていないことがわかります。安全のために、列を右クリックして、形式を明示的にテキストとして設定し、Excelファイル形式として保存します。

Excel形式のファイルを開いても、列は正常です。


1
これ機能しますが、壊れた英語しか話さない人に、別のオフィススイートを使用する必要がある理由を説明しようとすると、解決するのと同じくらい多くの問題が発生します。私の意見では、M $ Officeの代替ソフトウェアはすべて良いと思いますが、すべての人を改宗させることはできないことに気付きました。
アトルーン

0

インポートウィザードは、一般ユーザーや1回限りの状況に最適なソリューションです。プログラムによるソリューションが必要な場合は、QueryTables.Addメソッドを使用できます(これは、インポートウィザードが舞台裏で使用しているものです)。

Workbooks.Add
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & "C:\myfile.csv", Destination:=Range("$A$1"))
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 437
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 2, 2) 'Edit this line. Add a number for each column, 1 is general, 2 is text. Search the internet for other formats.
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
End With
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.