5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

最強のCSVファイルの読み込み(自称)~PHP編~

Posted at

csv_title.png

お初にお目にかかります。みのりと申します。m(__)m

いつもこちらのサイト様(=Qiita)には、大変お世話になっておりまして、我が家では、**「転ばぬ先のQiita」「一寸先はQiita(?)」**などの家訓が根付いております。

そんなGeekの皆さんが集う中にお邪魔して良いのかわからないのですが、
汎用的(この言葉も死語かしらん)に使えそうな(あくまで「使えそう」)部品を恩返し的にご提供できればと思い、ちまちま書いてみた過去の落穂拾い的な駄コードを、恥を忍んでアップしてみようという次第です。

**御用とお急ぎでなかったら、ゆっくりしてってね!**>定型文

さて、前置きがありえないくらい長くなりましたが、業務でもよく使われるのが、CSVファイルの読み込みかと思われます。

CSVファイルからデータを取り込んで、そのままTBにぶち込むとかが定番でしょうか。

そこで、割りと問題になるのが、

  1. CSVファイルの項目が変更(増減等)されて、改修しないとデータを投入しているテーブルとの整合性が取れない

  2. CSVファイルがExcel等で開かれ、勝手にエンコードが変わってしまい、システムで読み込めなくなった

  3. CSVファイルの行数、ファイルサイズが膨大になり、ファイルを複数に分割することになり、読み込み部分を改修しなければならなくなった

  4. CSVファイル等のパスをコードに直書きしていたら、CSVファイルの配置場所が変更になり、コードに手を入れることになった

といった点かと思われます。

4はさすがに無いとしても、1~3は意外と起こりうるケースではないでしょうか。

そこで、こうしたケースは最初から回避してしまうのが吉かと思われますので、上記を満たすコードを考察(大袈裟)してみました。

解決策=理想郷(だから、大袈裟)としては、以下の4点です。

  1. CSVファイルの項目が変更されても、configファイルのような外部ファイルを手直しするだけで、対応可能にする

  2. 配置ディレクトリ内のCSVファイルを何ファイルでも任意の数、読み込めるようにする

  3. 読み込んだCSVファイルのエンコードを、思惑通りのものに変換する

  4. CSVファイルのパス等は、configファイルのような外部ファイルに書いておく

あ、なんか忘れていましたが、今回チャレンジしているのはPHPです。>前置きの無駄遣い

ちなみに、3.のファイルのエンコードの変換に関しては、こちらを参考にさせて頂いております。

こちらはその性質上、手の加えようがないため、ほぼそのまんまです。実に申し訳ない。。

さて、このように大変恐縮なシロモノですが、何かのお役に立つようでしたら、みんな大好きGitHubにコードを置いてありますので、ご自由にお使い下さい。

尚、当然の話ですが、CSVで一行目がヘッダー(?)項目でないファイルの場合は、勝手が違いますので、そのままでは使えません。適宜改修して頂けますと幸いです。
(ヘッダーありなしのフラグ作って、真の最強目指せばいいじゃん俺って思いますが、「それはまた、別のお話(懐かしい)」)

ちなみに、以前関わった案件でまさに、これらの要件にぶち当たったために書いたコードが元ネタなのですが、さすがに業務で使用したものをそのまま紹介する訳にはいかないということで、手を入れたら、まったく別モノになりました。

当時はファイルの文字コード等は固定だったため、3.のファイルのエンコードの変換等は搭載していなかったのですが、その辺りも入れられて(明らかに人のふんどしで(以下略)、ますます汎用的(だから、死語?)になったかな?と思われます。(自己満足)

目指すゴールが同じでも、別の方法でも実現できる。
プログラミングって素敵(はあと)。

最後になりましたが、Class名などのネーミングセンスが致命的なのは、どうか、そっとしておいてあげてください。
また、文章がしらふなのに、酔っ払ったようなテンションなのは、中の人の**「仕様」です。
→「しらふなのに酔っ払ったテンション」はリアルに中の人が周りに言われ続けている
公式の見解**(?)です。

次回は、こちらをRubyで書き換えてみようと思います。

という訳で、言いたいことは、アレだ。

**お暇なら次回も見てよね(はあと)。**>定型文ではじまり、定型文でしめる

ちなみに、タイトルの「最強」は、もちろん、ネタです。本気で突っ込まないで下さいね。

初めての投稿がこれでよかったのか、今日も悩みの尽きないみのりさんでした。。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?