[SSIS] Excel から型情報を意識せずに確実に読み込む方法

環境

SQL Server 2005, 2008, 2008 R2

発生する問題

SSIS (SQL Server Integration Services) の データクローから「Excel ソース」を使用すると Excel ファイルからデータを取り込むことができます。Excel の中身がヘッダ1行と2行目以降がデータという一般的なテーブルレイアウトであれば、そのままデータベースに取り込めるので結構便利です。

しかし、実際に使ったことがある方は経験されていることが多いと思いますが、Excel のデータの中身が変わると、SSIS デザイナ上でなぜか型が一致しないという警告が出ることがあります。一度詳細を開いて更新すればもとに戻りますが、Excel の中のデータが変わるとまた警告がでる、の繰り返しになります。

また、場合によっては Excel の中にはきちんとデータがあるにも関わらず、実際に読み込んでみると null で読み込まれる場合があります。

これらの現象は SSIS の問題ではなく、SSIS が Excel の読み込みコンポーネントとして使用している「Excel ISAM ドライバ」の仕様の問題で発生します。これは「Microsoft Jet 4.0 OLE DB Provider」でも「Microsoft Office 12.0 Access Database Engine OLE DB Provider」でも同様です。

このドライバが何をしているかというと、データを読み込む際にわざわざ型指定して読み込まなくても、Excel の中身を見て自動的に型を判別してくれるという便利そうな処理をしていますが、その代り、データの中身の型がころころ変わると読み込む際の型情報も変わってしまいます。そのため、SSIS 上のデザイナでも、事前に型を決定しているにもかかわらず、Excel の中身の型が変わってしまうことによって型が不一致であるという警告が表示されるのです。

このあたりの使用は下記のサイトをみるとわかりやすいかと思います。

簡単にまとめると、Excel の上位8行を読み込み、その列で最も多い型を読み込む型として使用するようになっています。例えば8行内に、文字列が3つ、数値が5つあればその列は「数値型」になります。逆に文字列が6つ、数値が2つであればその列は「テキスト型」になります。同じ個数の場合は「数値型」が優先されます。

ちなみに SSIS で説明していますが、ISAM ドライバーの問題なので、これを使うプログラムはすべて同じ問題を抱えています。

対応方法

ではこれを確実に回避するにはどうすればいいかというと、少し手を込んだことをしなければいけません。

まず、今回の対応方法としては前提条件としてすべての列を文字列として読み込みます。もともと数値の列も文字列として読み込むので、読み込んだ後は数値に変換する必要があります。これは臨機応変に対応してください。

ISAMドライバーで読み込む際、「IMEX」というパラメータを指定することができます。これに「1」を指定すると「インポート モード」になり、読み込むすべてのデータがテキストになります。ただし、Excel 内の指定した列のデータがすべて数値の場合は数値になってしまうので注意してください。一つでも文字列があれば読み込む型は文字列になります。

IMEX パラメータは「接続文字列」で指定します。SSIS デザイナで接続文字列を編集する場合は、接続マネージャーで作成した Exce ソースを右クリックし、プロパティを開きます。プロパティエリアに「ConnectionString」という項目がありますので、その文字列を直接編集します。GUI で設定するパターンもありますが、こちらは IMEX が設定できないので注意してください。

IMEX パラメータは下記のように設定します。一番後ろにある「Extended Properties」内にセミコロン区切りで「IMEX=1」を追加します。

  • Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:Test.xlsx; Extended Properties="Excel 12.0; HDR=YES; IMEX=1;”

接続文字列については以前まとめましたのでこちらのページを参照してください。

さて、これですべての列は文字列として読み込める「はず」なのですが、前述したとおり、Excel にすべて数値が入力されていた場合、または何も入力されていない場合はどうしても列の型が数値として読み込まれてしまいます。ですので、Excel の1行目か2行目に「1行すべて文字列だけを入力した行」を入れるようにします。こうすればほぼ間違いなく文字列として読み込めるようになります。読み込みもとの Excel ファイルにもよりますが、テキスト行を作ってその行だけ非表示にすれば編集上は問題ないかと思います。

 

まあ、個人的には Excel で読み込むのではなく、型を意識しない CSV ファイルのほうがよかったりもするんですけどね。Excel 上で編集すると「0000」とテキストとして貼り付けたつもりが数値として 0 になってしまってて気づかなかったりとかあるので。実は CSV も CSV でダブルクォーテーションのエスケープが考慮されてなかったりとかいろいろ問題はありますが (^^;)

]]>

SkyDrive for Windows 同期ツールが何度も再起動する件についての補足

ある特定の環境において SkyDrive for Windows 同期ツールが勝手に再起動を繰り返す現象に悩まされていました。

環境は以下のとおりです。

  • OS:Windows 7 Ultimate SP1 x64
  • メモリ:2.5GB (ただし動的メモリで最大8GBまで拡張可能)
  • 媒体:仮想OS (Hyper-V 3.0 ゲスト)

この件について、Microsoft Answersで「SkyDrive for Windows 同期アプリが何度も再起動する」という表題で質問したところ、Microsoftの回答としては「Hyper-V上のゲストOSではサポートしていない」とのことでした。

質問の件についてはいったんこれで終了したのですが、その後、原因っぽいのを発見しました。

SkyDrive はそのままインストールしていたのですが、フォルダ構成などを作り変えていたらいつの間にか SkyDrive が再起動することなく正常に動作していました。そしてフォルダの再構成として「シンボリックリンク」を使ってフォルダを作成したところ、SkyDrive がまた再起動を繰り返すようになってしまいました。

おそらくこの「シンボリックリンク」がSkyDrive が再起動する原因ではないかと思います。ただ、物理 PC の Windows 8 の環境ではシンボリックリンクでフォルダを作成しても特に再起動していなかったイメージがあったので、「仮想 OS 環境でシンボリックリンクを使う」または「Windows 7 環境でシンボリックリンク」を使うと SkyDrive が異常終了して再起動するのではないかと思います。

まあ、きちんと検証しているわけではないのであくまでも「想定」なんですけどね(^^;)

]]>

Zune のプレイリストってどこに保存されるの?

ライブラリのミュージックフォルダを見るとわかります。

きちんと確認しているわけではありませんが、Windows Media Playerのプレイリストと一緒に使われているみたいです。ただ、Zune に Windows のライブラリと切り離す設定があるので、切り離すと Windows Media Player の Playlists ではなく Zune の Playlists フォルダに保存されるかもしれません。

切り離していない場合は上記のどちらのフォルダにファイル(.zpl)を保存しても Zune は読み取ってくれます。

]]>

TVTest, HDUCを使用してWindows 8で地上波テレビを見る

注意

ここに記載しているのはメモ書きです。

説明している手順は途中で必要なものがぬけていたりしていますので、不足分は各自補完してください。また、機材やソフトウェアも限定しているのでご注意ください。

ここで説明した手順を実施してPCに不具合等が発生した場合でも責任は負えませんので自己責任で行ってください。また、不正な扱い等も行わないようにしてください。ここでは視聴が可能になるまでの手順を説明しています。今後の法改正でこれらの操作が違法行為になる可能性も捨てきれませんので、それらを認識したうえでの参考資料としてください。

環境

  • Windows 8 x64 Enterprise

使用するもの

  • TVTest
  • MonsterTV HDUC (HDUSでもほぼ同じ)

手順

まず、Windows 8 でドライバの署名チェックをしないように設定します。詳しい説明は以下のサイトでも説明されているのでそちらをご覧ください。

コマンドプロンプトを「管理者権限」で起動し、以下のコマンドを実行、Windows 8 をテストモードにします。

image

bcdedit /set TESTSIGNING ON

※戻すときはOFFにしてください。

Windowsを再起動してドライバーの署名の強制を無効にします。この時通常の手順で再起動するのではなく、以下の手順で再起動します。

[チャーム] > [設定] > [PCの設定変更] > [全般] > [PCの起動をカスタマイズする] > [今すぐ再起動する] > [トラブルシューティング] > [詳細オプション] > [スタートアップ設定]

※チャームはマウスポインタをデスクトップの右上や右下に移動したときにでてくるアレです。

image

再起動すると、スタートアップ設定の画面が表示されるので「7)ドライバー署名の強制を無効にする」を選択します。(キーボードの7を押す)

デスクトップ右下にテストモードが表示されているか確認します。

image

 

さて、ここからはTV視聴用のデバイスを接続する手順になるため、持っているものによって方法が異なったりします。ここでは「MonsterTV HDUC」について説明していますが、ドライバーの事前準備などについては説明していません。 (よく説明されているのは HDUS なのですが、同じ系列なので問題なく使えると思います)

Webで調べるといくつかサイトがありますのでそちらを参照してください。(参考サイトですが、以前参照していたサイトがなくなったりと浮き沈みが激しい界隈なので自力で探してください。おそらくここら辺が一番面倒だったりします)

関連のありそうなサイト (あまりみてない)

 

ここではドライバーがすでに用意してあるものとして説明しています。一応 Windows Vista (x64), Windows 7 (x64) 用で使用したドライバーでも問題なく動作しています。

ドライバーの準備ができたら HDUC を USB で接続します。自動的にドライバーがインストールされますが、有効なドライバーではないので終わるまでそのまま待ちます。

デバイスマネージャーを開き、ドライバーが正常に認識されていないデバイスを右クリックして「デバイスの更新」を選択します(ここではAUSBDTV)。ここからの手順は環境によって異なるかもしれません。一例として見ておいてください。

image

「コンピューターを参照してドライバー ソフトウェアを検索します」を選択。

image

パス指定で用意したドライバーのあるフォルダを選択します。選択したら「次へ」をクリック。

image

正常にドライバーがインストールされればOKです。もう一度デバイスマネージャーを参照すると下のように「SKNET」が表示されます。これらに対しても同じようにドライバーをインストールしてください。

image

下のようなダイアログが出た場合はそのままインストールを続行してください。

image

これでドライバーのインストールは完了です。

 

続 いてMPEG-2コーデックをインストールします。Windows 8 は動作再生のコーデックは基本的なものしか入っておらず、利用料金のかかる MPEG-2 コーデックは入っていません。

ここではフリーで配布されているコーデック「ffdshow」をインストールします。下記のサイトからダウンロードしてください。

ダウンロードしたらインストールしてください。途中 MPEG-2 コーデックをインストールするように設定を忘れないでください。デフォルトでは選択されていません。

 

ここまで完了したら「TVTest.exe」を起動して地上波テレビが見れるか確認してください。TVTest についてはいろんなサイトに説明が載っているのでそちらを参照してください。

]]>

Word 2010 で URL などに勝手にハイパーリンクが設定されないようにする

Word の入力時に URL を入力して Enter キーなどを押すと URL にハイパーリンクが付加され、クリックすると HTTP の場合は Web ページが開いてしまいます。

Excel と同じようにこの機能は Word でも無効にすることができます。Excel とは少し場所が違うので簡単に手順を説明します。

ファイルメニューから「オプション」を選択。

image

Word のオプションダイアログが開いたら、左のメニューから「文章校正」、右のエリアから「オートコレクトのオプション」ボタンをクリック。

image

オートコレクトダイアログで「入力オートフォーマット」タブを選択し、「インターネットとネットワークのアドレスをハイパーリンクに変更する」のチェックを外してOKボタンをクリックします。

image

ちなみに「オートフォーマット」タブにも「インターネットとネットワークのアドレスをハイパーリンクに変更する」がありますが、こちらのチェックは外さなくても無効にできるようです。

image

]]>

Windows 8, Windows Server 2012 でファイルを削除するときに確認メッセージを表示させる

Windows 8, Windows Server 2012 はファイルを削除するときに初期設定では削除確認のダイアログが出なくなりました。確認ダイアログが邪魔という人にとっては朗報かもしれませんが、Delete キーを押すとスカッとファイルが消えてしまうのでちょっと驚いてしまいます。もちろんゴミ箱にはファイルはあるので一応安心してください。

このファイル削除確認ダイアログがほしい場合は以下の手順で表示させることができます。

デスクトップに配置されているごみ箱を右クリックして「プロパティ」を選択します。

image

プロパティ画面が表示されたら「削除の確認メッセージを表示する」にチェックを入れて OK ボタンをクリックします。

image

これでファイル削除の確認ダイアログが表示されます。

image

]]>

Windows 8, Windows Server 2012 で IME の入力状態をアプリケーションごとに持たせるようにする

Windows 8 や Windows Server 2012 ではなぜか IME の入力状態(英数字入力、ひらがな入力など)が OS 全体で持っている形になっています。たとえばアプリAのテキストボックスでひらがな入力の状態にし、アプリB のテキストボックスにフォーカスと移動させてもひらがな入力の状態になっています。

新規ユーザーのために使いやすくしているのかもしれませんが、それ以前の OS では標準でアプリケーションごとに IME の入力状態を持っているので、人によっては使いづらいかもしれません。

IME の入力状態をアプリケーションごとに持たせるには以下の手順で設定します。Windows 8, Windows Server 2012 のみの設定です。

マウスをデスクトップの右上か右下に移動させチャームを表示させます。メニューから「設定」を選択します。

image

設定メニューから「コントロール パネル」を選択します。

image

コントロール パネルから「時計、言語および地域」を選択します。

image

「言語」をクリックします。

image

「詳細設定」をクリックします。

image

「入力方式の切り替え」から「アプリ ウィンドウごとに異なる入力方式を設定する」にチェックを入れ、保存ボタンをクリックします。

image

]]>

Windows Server 2012 のネットワーク共有をパブリックからプライベートに変更する

Windows Server 2012 をインストールし、ネットワークの構成を見てみると、ネットワークがパブリックであることに気づきます。

image

以前は OS インストール時とかにネットワークがどこにあるかの設定を行うことができたかと思うのですが、2012 や 8 ではインストール時点で聞かれることがなくデフォルトの設定になっています。2012 でパブリックになっているのはおそらく外部からのアクセスをできる限り防ぐためではないかと思います。(実際の理由はわかりません)

しかし、イントラ内だけに公開するサーバーの場合、このままだとリモートデスクトップ接続などいくつか作業上不便になってしまうので、プライベートに変更したいと思うのですが、8 や 2012 ではネットワークと共有センターからでは変更できなくなっています。たしか 2008 や 7 ではできていたと思います。

これを変更するには以下の手順を踏みます。

マウスをデスクトップの右上か右下にもっていきチャームを表示させます。そして「設定」を選択します。

image

いくつか項目が表示されるので、下の項目から「ネットワーク」を選択します。

image

「ネットワーク 接続済済み」を右クリックして「共有のオン/オフを切り替える」を選択します。

image

「はい、共有をオンにしてデバイスに接続します」を選択します。

image

するとネットワークが「プライベート ネットワーク」に変更されたことがわかります。

image

ちなみに「いいえ、共有をオンにせずデバイスに接続しません」を選択するとパブリック ネットワークに戻ります。

]]>

Windows Server 2012 でのコンピューターの管理の開き方

概要

Windows Server 2008, 2008 R2 ではサーバーマネージャーを開けばコンピューターの管理に関連する大体の操作は行えたのですが、2012 になるとサーバー マネージャーは最低限のみの実相になっており、ユーザーアカウントやファイアウォールの設定が行えません。

そのため、これらの操作を行うには以前の OS であった「コンピューターの管理」を開かなければいけません。2012 を初めて使うとどこにあるかわかりにくいです。

手順

サーバーマネージャーを開きます。

image

右上のメニューの「ツール」から「コンピューターの管理」を選択します。

image

後は従来通りの操作。

image

もう一つの操作方法としてはサーバーマネージャーから「ローカル サーバー」を選択。(すべてのサーバーってあるから他のサーバーも管理できるのではないかと。未検証)

image

画面中央にプロパティやイベントが表示されるので、プロパティの右にある「タスク」から「コンピューターの管理」を選択。

image

]]>