[ASP.NET] CSV ファイルをダウンロードさせる。

ASP.NET で CSV ファイルを作成してダウンロードさせるメモ。
// 適当な CSV フォーマット
var csvContents = new List() { "名前,ポイント" };
csvContents.Add("\"Noah\",\"4,090\"");
csvContents.Add("\"Liam\",\"90\"");
csvContents.Add("\"Sophia\",\"4,011\"");
csvContents.Add("\"Emma\",\"9,801\"");
var outputPath = @"d:\CsvSample.csv";

// ファイルがなくても OK
File.Delete(outputPath);
using (var writer = new StreamWriter(outputPath, true, Encoding.Default))
{
    // TODO: 例外処理を書く
    writer.WriteLine(string.Join("\r\n", csvContents));
}

// ダウンロード
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=CsvSample.csv");
Response.Flush();
Response.WriteFile(outputPath);
Response.End();
VB.NET の場合は以下のとおり。
'適当な CSV フォーマット
Dim csvContents = New List(Of String)(New String() {"名前,ポイント"})
csvContents.Add("""Noah"",""4,090""")
csvContents.Add("""Liam"",""90""")
csvContents.Add("""Sophia"",""4,011""")
csvContents.Add("""Emma"",""9,801""")

Dim outputPath = "d:\\CsvSample.csv"
' ファイルがなくても OK
File.Delete(outputPath)

Using writer As New StreamWriter(outputPath, False, Encoding.Default)
    writer.WriteLine(String.Join(Environment.NewLine, csvContents))
End Using

' ダウンロード
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Disposition", "attachment; filename=CsvSampleVb.csv")
Response.Flush()
Response.WriteFile(outputPath)
Response.End()
出力された CSV ファイルを Excel で開いた場合。

[Excel] 金額等のカンマ付きの値を正しく表示させる

商品,値段
冷凍青汁,100
サービス10,000円チケット,10000

Excel で、「10,000円」などが含まれる CSV ファイルを何も考えずに開くと崩れてしまう。TSV を使うという手もあるが、" (ダブルクォーテーション) でくくってあげるだけで正しく表示される。" で囲むほうが確実だ。

商品,値段
"冷凍青汁",100
"サービス10,000円チケット",10000

Excel の例は上記のとおりだが、CSV にも仕様がある。

CSVファイルの一般的書式 (RFC4180 日本語訳)
http://www.kasai.fm/wiki/rfc4180jp

[SQL Server] 列を CSV として出力する

テーブルをリレーションする際に、ある ID から取得した結果を一行にまとめて結合させたい場合、FOR XML を使う。これにより、結果セットを CSV に整形した結果を一行にまとめて表示させることも可能。

Classes

Students

FOR XML は、取得した項目に区切り文字を連結させて使用する。以下は、何も考えないで連結するパターン。値の終端にもカンマが付いてしまっている。
SELECT
 C.Code AS クラスコード
 ,C.Name AS クラス名
 ,(SELECT S.FirstName + ',' FROM Students AS S WHERE S.ClassCode = C.Code FOR XML PATH('')) AS メンバー
FROM Classes AS C

値を [data()] として扱い、一旦スペースに変換してから、スペースを , に変換すると、スマートにな表示になる。
SELECT
 C.Code AS クラスコード
 ,C.Name AS クラス名
 ,REPLACE(
  (SELECT S.FirstName AS [data()] FROM Students AS S WHERE S.ClassCode = C.Code FOR XML PATH('')), ' ', ',') AS メンバー
FROM Classes AS C

[Android] 二段階認証をかけたアカウントを追加する。

Android 端末に Google アカウントを追加する際、対象アカウントに二段階認証を設定している場合は、通常のパスワードを入力しても認証が失敗する。二段階認証を設定しているアカウントを追加するには、「アプリ固有のパスワード」を設定する必要がある。
  1. Google のアカウント設定画面を開く。
  2. [2 段階認証プロセス] - [設定]
  3. [アプリケーション固有のパスワードの管理] を開く。
  4. 端末を選択し、アプリを選択(特に厳密である必要はない)したのちに「生成」ボタンを押下する。
  5. パスワードが表示されるので、表示されたパスワードを使用して端末でログインする。
なお、Android だけではなく、未登録の PC のメーラー、iPhone や iPad などで設定する場合にもこの方法でセットアップを行う。