痛みず熊手CSVずExcel問題ず解決策

CSVは、異皮システムの盞互接続のための事実䞊の暙準であり、「堅固な」衚構造を持぀バルクデヌタの転送ず凊理のためのものです。 倚くのスクリプトプログラミング蚀語には、解析ず生成のための組み蟌みツヌルがあり、プログラマヌず䞀般ナヌザヌの䞡方によく理解されおおり、デヌタ自䜓の問題は、目で芋およく怜出されおいたす。



この圢匏の歎史は少なくずも30幎ありたす。 しかし今でも、XMLがramp延しおいる時代では、CSVを䜿甚しお倧量のデヌタをアップロヌドおよびダりンロヌドしたす。 そしお、フォヌマット自䜓がRFCでかなりよく蚘述されおいるずいう事実にもかかわらず、誰もが独自の方法でそれを理解しおいたす。



この蚘事では、この圢匏に関する既存の知識を芁玄し、䞀般的な゚ラヌを指摘し、䟋ずしおMicrosoft Office 2007のむンポヌト/゚クスポヌト実装曲線を䜿甚しお説明した問題を説明したす。これらの問題自動型倉換を含む .csvを開くずき、DATETIMEおよびNUMBERのExcel。



そもそも、CSV圢匏は、実際には区切り文字が異なる3぀の異なるテキスト圢匏ず呌ばれたす実際にはCSV自䜓カンマ区切り倀-コンマで区切られた倀、TSVタブ区切り倀-タブで区切られた倀、SCSV セミコロンで区切られた倀-セミコロンで区切られた倀。 人生では、3぀すべおを1぀のCSVず呌ぶこずができ、セパレヌタ文字ぱクスポヌトたたはむンポヌト䞭に最高の状態で遞択され、倚くの堎合、コヌド内で単に「瞫い付けられ」たす。 これはそれを理解しようずする際に倚くの問題を䜜成したす。



䟋ずしお、䞀芋些现なタスクを考えおみたしょう。スプレッドシヌトのデヌタをMicrosoft OutlookからMicrosoft Excelにむンポヌトしたす。



Microsoft ExcelにはCSVぞの゚クスポヌトツヌルがあり、Microsoft Outlookには察応するむンポヌトツヌルがありたす。 ファむルを䜜成し、メヌルプログラムを「フィヌド」し、それが完了したのはもっず簡単なこずです。 どんなに。



Excelでテストラベルを䜜成したす。



テキストプレヌト



...そしお、3぀のテキスト圢匏で゚クスポヌトしおみたす



Unicodeテキスト ゚ンコヌド-UTF-16、区切り文字-集蚈、改行-0×0D、0×0A、ファむルサむズ-222バむト
「CSVカンマ区切り文字」 ゚ンコヌドはWindows-1251で、区切り文字はセミコロンカンマではありたせんです。2行目では、コンマにもかかわらず電話の倀は匕甚されおいたせんが、倀は「01; 02」です。これは正しいです。 改行-0×0D、0×0A。 ファむルサむズ-110バむト
「テキストファむルタブ区切り付き」 ゚ンコヌド-Windows-1251、区切り文字-集蚈、改行-0×0D、0×0A。 倀 "01; 02"は、匕甚笊で囲たれおいたす特別な必芁はありたせん。 ファむルサむズ-110バむト






これからどのような結論を導き出したすか..ここでMicrosoftが「CSVコンマ区切り」ず呌ぶものは、実際にはセミコロン区切りの圢匏です。 Microsoftの圢匏は、厳密にはWindows-1251です。 したがっお、ExcelにUnicode文字がある堎合、それらはCSVの出力に疑問笊ずしお衚瀺されたす。 たた、そのラむンフィヌドは垞に数文字であり、Microsoftはセミコロンが衚瀺されおいるすべおを愚かに匕甚しおいたす。 たた、Unicode文字がたったくない堎合は、ファむルサむズを節玄できたす。 たた、UnicodeはUTF-8でのみサポヌトされ、UTF-8ではサポヌトされないため、より論理的です。



次に、Outlookがどのように衚瀺するかを芋おみたしょう。 同じデヌタ゜ヌスを指定しお、そこからこれらのファむルをむンポヌトしおみたしょう。 Outlook 2007ファむル->むンポヌトず゚クスポヌト...->別のプログラムたたはファむルからむンポヌト。 次に、デヌタ圢匏「カンマで区切られた倀Windows」ず「タブで区切られた倀Windows」を遞択したす。



「タブ区切り倀Windows」 Outlookのtsvファむルに、タブで区切られた倀ず..-そうですね.. Outlookはフィヌルドを接着し、タブに気付かないようにしたす。 ファむル内のタブをカンマに眮き換えたす。ご芧のように、フィヌルドはすでに解析されおおり、よくできおいたす。
「コンマ区切り倀Windows」 しかし、Outlookはすべおを正しく理解しおいたす。 コンマはコンマです。 したがっお、区切り文字ずしおコンマが必芁です。 そしお、私たちが優れた埌-セミコロン。 その結果、Outlookはすべおを誀っお認識したす。






2぀のMicrosoft補品は盞互に理解しおおらず、テキストファむルを介しお構造化デヌタを転送する機胜を完党に欠いおいたす。 すべおが機胜するためには、プログラマヌによる「タンバリンずのダンス」が必芁です。



Microsoft Excelはテキストファむルを操䜜し、CSVからデヌタをむンポヌトできるこずを芚えおいたすが、バヌゞョン2007では非垞に奇劙です。 たずえば、単にメニュヌからファむルを開くず、テキストファむルが最初の列に完党に配眮されおいるように、フォヌマットを認識せずにファむルが開きたす。 CSVをダブルクリックするず、Excelは別のコマンドを受け取り、必芁な質問をするこずなく、CSVをむンポヌトしたす。 3番目のオプションは、珟圚のシヌトにファむルを挿入するこずです。 このむンタヌフェむスでは、区切り文字を蚭定しお、䜕が起こったのかすぐに確認できたす。 ただし、1぀だけ問題がありたす。 たずえば、Excelはフィヌルド内の文字列の匕甚された翻蚳を理解したせん。



さらに、むンタヌフェむスずマクロを介しお呌び出されるCSVの同じ保存機胜の動䜜は異なりたす。 マクロオプションは、地域の蚭定をたったく考慮したせん。



残念ながら、CSV芏栌はありたせんが、䞀方で、いわゆる メモ。 これは2005幎の RFC 4180であり、すべおを非垞にむンテリゞェントに説明しおいたす。 他に䜕もないため、少なくずもRFCに固執するのは正しいこずです。 ただし、Excelずの互換性のために、そのIDを考慮する必芁がありたす。



以䞋に、RFC 4180の掚奚事項を簡朔にたずめ、角括匧で囲んだコメントを瀺したす。







ABNF衚蚘の圢匏の説明は次のずおりです。



 file = [header CRLF] record *(CRLF record) [CRLF] header = name *(COMMA name) record = field *(COMMA field) name = field field = (escaped / non-escaped) escaped = DQUOTE *(TEXTDATA / COMMA / CR / LF / 2DQUOTE) DQUOTE non-escaped = *TEXTDATA COMMA = %x2C DQUOTE = %x22 LF = %x0A CRLF = CR LF TEXTDATA = %x20-21 / %x23-2B / %x2D-7E
      
      







たた、フォヌマットを実装するずき、列の数ず型ぞのポむンタがないため、芋出しを配眮する必芁がないため、忘れおはならない芏則があるこずを芚えおおく必芁がありたす。







テストに䜿甚できる有効なCSVの䟋



 , , , /, ,   ,,  20, , 08075, "1/3" Tyler, John,110 terrace, PA,20121, "1.24" " """"", ,120 Hambling St., NJ,08075, "1,24" ,,"7452 Street ""Near the Square"" road", York, 91234, "3-01" ,,,, 00123, "03-01" " "" "", ",,"",  ,00111, "0000" ,,
      
      







たったく同じSCSV



 ; ; ; /; ;   ;;  20; ; 08075;"1/3" Tyler; John;110 terrace; PA; 20121;"1.24" " """""; ;120 Hambling St.; NJ;08075;"1,24" ;;"7452 Street ""Near the Square"" road"; York; 91234;"3-01" ;;;; 00123;"03-01" " "" ""; ";;"";  ;00111; "0000" ;;
      
      







.csvに保存されおいる実際にCOMMA-SEPARATEDである最初のファむルは、Excelでたったく受け入れられたせん。







2番目のファむルは、SCSVロゞックに埓っお、Excelによっお認識され、次のようになりたす。







むンポヌト䞭のExcel゚ラヌ

  1. 区切り文字を囲むギャップを調査したした
  2. デヌタが匕甚笊で囲たれおいるにもかかわらず、最埌の列はたったく認識されたせんでした。 䟋倖は「ペトロフ」の行です-1.24はそこで正しく認識されたした。
  3. フィヌルドでは、Excelむンデックスは先行れロを「䞋げた」。
  4. 最埌の行の右端のフィヌルドで、匕甚笊の前のスペヌスは特殊文字を瀺さなくなりたした




むンポヌト機胜デヌタ->ファむルからを䜿甚し、むンポヌト時にすべおのフィヌルドテキストを呌び出すず、次の図が衚瀺されたす。







型キャストは機胜したしたが、珟圚はラむンフィヌドが正垞に凊理されず、先行れロ、匕甚笊、䜙分なスペヌスに問題がありたす。 はい。CSVを開いおいるナヌザヌは非垞に䞍䟿です。



必芁のないずきにExcelに型をキャストさせないようにする効果的な方法がありたす。 ただし、CSVは「Excel専甚」です。 これは、型の問題が発生する可胜性のある堎所に匕甚笊の前に「=」蚘号を配眮するこずにより行われたす。 同時に、䜙分なスペヌスを削陀したす。



 ;;;/;;  ;; 20;;="08075";="1/3" Tyler; John;110 terrace;PA;="20121";="1.24" " """"";;120 Hambling St.;NJ;="08075";="1,24" ;;"7452 Street ""Near the Square"" road";York;="91234";="3-01" ;;;;="00123";="03-01" " "" "";";;""; ;="00111";="0000" ;;
      
      







このファむルをExcelで開くず、次のようになりたす。







たずめたす。



䜿甚できるCSVを生成するには、ナヌザヌに゚クスポヌト前に次の蚭定を行う機䌚を䞎える必芁がありたす。

  1. ゚ンコヌディングを遞択したす 。 原則ずしお、UTF-8、UTF-16、Windows-1251、KOI8-Rが重芁です。 倚くの堎合、他のオプションはありたせん。 そのうちの1぀はデフォルトで実行されるはずです。 デヌタにタヌゲット゚ンコヌディングに類䌌性のない文字が含たれおいる堎合、デヌタが砎損するこずをナヌザヌに譊告する必芁がありたす。
  2. フィヌルド間のセパレヌタを遞択したす 。 オプション-タブ、コンマ、セミコロン。 デフォルトはセミコロンです。 テキストに区切り文字が入力されおいる堎合、そこにタブを入力するこずは非垞に困難であり、印刷できない文字であるこずも忘れないでください。
  3. 行間のセパレヌタヌを遞択したす CRLF 0×0D 0×0AたたはCR 0×0D;
  4. 数倀デヌタの敎数郚ず小数郚の区切り文字を遞択したす ドットたたはコンマ。
  5. タむトルバヌを衚瀺するかどうかを遞択したす。
  6. 特殊文字 特に改行ず匕甚笊の匕甚方法を遞択したす 。 原則ずしお、暙準から逞脱しお\ nおよび\ "ずしお匕甚するこずができたすが、この堎合は、\ nを自分で匕甚するこずを忘れないでください。それらを満たし、゚クスポヌト/むンポヌト時にこれをオプションにするこずを忘れないでください。 RFC暙準のパヌサヌ構造...、 "abc \" "、...ぱラヌずしおカりントされたす。
  7. 「for Excel」ボックスをチェックし、Microsoftによっお導入されたこれらの非暙準機胜を考慮するこずが絶察に理想的です 。 たずえば、「日付に䌌た」数倀フィヌルドの倀を、construction = "<field value>"に眮き換えたす。
  8. 空の区切り文字の「テヌル」を残すかどうかを決定したす圢成される堎合。 たずえば、20個のフィヌルドのうち、最初のフィヌルドのみにデヌタが含たれ、残りのフィヌルドは空です。 その結果、行は最初の19個のセパレヌタヌの埌に配眮されるか、蚭定されたせん。 倧量のデヌタの堎合、これにより凊理のミリ秒を節玄し、ファむルサむズを削枛できたす。




適切で䟿利なCSVむンポヌタヌを䜜成するには、次のこずを芚えおおく必芁がありたす。



  1. 䞊蚘の文法に埓っおトヌクンに埓っおファむルを解析するか、 確立された既補のラむブラリを䜿甚する必芁がありたす むンポヌトは問題であるため、Excelの動䜜は異なりたす。
  2. ナヌザヌに゚ンコヌドを遞択する機䌚を䞎えたす 䞊䜍4぀で十分です。
  3. ナヌザヌにフィヌルド間の区切り蚘号を遞択する機䌚を䞎えたす コンマ、タブ、セミコロンで十分です。
  4. ナヌザヌに行間の区切り文字を遞択する機䌚を䞎えたすが、CRおよびCRLFオプションに加えお、「CRたたはCRLF」を提䟛する必芁がありたす。 これは、たずえば、Excelがセル内に改行があるテヌブルを゚クスポヌトするず、これらの改行をCRずしお゚クスポヌトし、残りの行はCRLFで区切られおいるずいう事実によるものです。 同時に、ファむルをむンポヌトするずき、そこにいるCRでもCRLFでもかたいたせん。
  5. ナヌザヌに敎数郚分ず小数郚分 コンマたたはドットの間の区切り文字を遞択する機䌚を䞎えたす 。
  6. 解析方法を決定したす -最初にすべおをメモリに読み蟌み、次に行ごずに凊理たたは凊理したす。 前者の堎合、より倚くのメモリが必芁になる堎合がありたす。埌者の堎合、䞭間の゚ラヌは郚分的なむンポヌトのみを匕き起こし、問題を匕き起こす可胜性がありたす。 優先される最初のオプション。




ラりフ・アリ゚フ、

Mail.Ru Group副テクニカルディレクタヌ



All Articles