Markdownで表の記載をするときにイラッとした経験のある人集まれ

# はじめに
QiitaなどのMarkdown記法において、表の記載が出来るのですが途中で改行とか解んなくなって、イラッとして投稿を諦めたことはありませんか？
僕はあります。

サンプルは
Markdown: [Qiita](http://qiita.com/Qiita/items/c686397e4a0f4f11683d#2-4)
から取得
```
 | Left align | Right align | Center align |
 |:-----------|------------:|:------------:|
 | This       |        This |     This     |
 | column     |      column |    column    |
 | will       |        will |     will     |
 | be         |          be |      be      |
 | left       |       right |    center    |
 | aligned    |     aligned |   aligned    |
```
↓

| Left align | Right align | Center align |
|:-----------|------------:|:------------:|
| This       |        This |     This     |
| column     |      column |    column    |
| will       |        will |     will     |
| be         |          be |      be      |
| left       |       right |    center    |
| aligned    |     aligned |   aligned    |

# 前提条件
  ローカルにPHP実行環境があること
  UTF8でのファイル操作ができること

# どうする
Excelで作った表をMarkdownに変換しちゃいましょう。

## まず、以下のスクリプトを適当にサクッと書いて保存しておきます。
```php:tsvToMarkdown.php
<?php
if(count($argv) !== 2){
    echoUsage();
}
$tsv_file = $argv[1];
$row = 1;
if (($handle = fopen($tsv_file, "r")) === FALSE) {
    echoUsage($tsv_file." is not a readable file.");
}
while (($data = fgetcsv($handle, 1000, "\t","\"")) !== FALSE) {
    echo str_replace(array("\r","\n"), "", nl2br("| ".implode($data, " | ")." |"))."\n";
    if($row == 1){
        echo "|".implode(array_fill(0, count($data), ":---------") , "|")."|\n";
    }
    $row++;
}
fclose($handle);

function echoUsage($msg = null){
    echo "Usage: ./tsvToMarkdown.php [target_tsv_file]\n";
    echo "TSV ファイルはUTF8で記載してください。\n";
    echo $msg;
    exit(1);
}
```

## Excelで適当に表を書き、Markdown化したい範囲をクリップボードにコピーします。
![エクセル表サンプル.jpg](https://qiita-image-store.s3.amazonaws.com/0/38018/b4b9bc17-af85-7f30-5ace-eabb68c6f7d5.jpeg)


## コピーした内容をテキストエディタに貼り付けてUTF-8で保存します。
```txt:table_sample.tsv
		概要（聞かれてその意味を自分の言葉で答えることができること）	営業職	エンジニア職
クロスサイト・スクリプティング(XSS)	最低限の知識	簡単に概要を説明できる	○	○
	踏み込んだ知識	サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる	△	○
	対策を実行出来る	"一般的な対策方法を実装出来る
ダメな対策例を説明できる"		○
SQL インジェクション	最低限の知識	簡単に概要を説明できる	○	○
	踏み込んだ知識	サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる	△	○
	対策を実行出来る	"一般的な対策方法を実装出来る
ダメな対策例を説明できる"		○
OSコマンドインジェクション	最低限の知識	簡単に概要を説明できる	○	○
	踏み込んだ知識	サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる	△	○
	対策を実行出来る	"一般的な対策方法を実装出来る
ダメな対策例を説明できる"		○
クロスサイト・リクエストフォージェリ（CSRF）	最低限の知識	簡単に概要を説明できる	○	○
	踏み込んだ知識	サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる	△	○
	対策を実行出来る	"一般的な対策方法を実装出来る
ダメな対策例を説明できる"		○
Session Fixation（セッションIDの固定化)	最低限の知識	簡単に概要を説明できる	○	○
	踏み込んだ知識	サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる	△	○
	対策を実行出来る	"一般的な対策方法を実装出来る
ダメな対策例を説明できる"		○
HeaderInjection攻撃	最低限の知識	簡単に概要を説明できる	○	○
	踏み込んだ知識	サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる	△	○
	対策を実行出来る	"一般的な対策方法を実装出来る
ダメな対策例を説明できる"		○
```

これで、タブ区切り、ダブルクオーテーションでクオートされたファイルが作成されます。

## 最初に作った変換スクリプトを走らせます。
php ./tsvToMarkdown.php table_sample.tsv > result.txt

```txt:result.txt
|  |  | 概要（聞かれてその意味を自分の言葉で答えることができること） | 営業職 | エンジニア職 |
|:---------|:---------|:---------|:---------|:---------|
| クロスサイト・スクリプティング(XSS) | 最低限の知識 | 簡単に概要を説明できる | ○ | ○ |
|  | 踏み込んだ知識 | サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる | △ | ○ |
|  | 対策を実行出来る | 一般的な対策方法を実装出来る<br />ダメな対策例を説明できる |  | ○ |
| SQL インジェクション | 最低限の知識 | 簡単に概要を説明できる | ○ | ○ |
|  | 踏み込んだ知識 | サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる | △ | ○ |
|  | 対策を実行出来る | 一般的な対策方法を実装出来る<br />ダメな対策例を説明できる |  | ○ |
| OSコマンドインジェクション | 最低限の知識 | 簡単に概要を説明できる | ○ | ○ |
|  | 踏み込んだ知識 | サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる | △ | ○ |
|  | 対策を実行出来る | 一般的な対策方法を実装出来る<br />ダメな対策例を説明できる |  | ○ |
| クロスサイト・リクエストフォージェリ（CSRF） | 最低限の知識 | 簡単に概要を説明できる | ○ | ○ |
|  | 踏み込んだ知識 | サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる | △ | ○ |
|  | 対策を実行出来る | 一般的な対策方法を実装出来る<br />ダメな対策例を説明できる |  | ○ |
| Session Fixation（セッションIDの固定化) | 最低限の知識 | 簡単に概要を説明できる | ○ | ○ |
|  | 踏み込んだ知識 | サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる | △ | ○ |
|  | 対策を実行出来る | 一般的な対策方法を実装出来る<br />ダメな対策例を説明できる |  | ○ |
| HeaderInjection攻撃 | 最低限の知識 | 簡単に概要を説明できる | ○ | ○ |
|  | 踏み込んだ知識 | サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる | △ | ○ |
|  | 対策を実行出来る | 一般的な対策方法を実装出来る<br />ダメな対策例を説明できる |  | ○ |
```

|  |  | 概要（聞かれてその意味を自分の言葉で答えることができること） | 営業職 | エンジニア職 |
|:---------|:---------|:---------|:---------|:---------|
| クロスサイト・スクリプティング(XSS) | 最低限の知識 | 簡単に概要を説明できる | ○ | ○ |
|  | 踏み込んだ知識 | サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる | △ | ○ |
|  | 対策を実行出来る | 一般的な対策方法を実装出来る<br />ダメな対策例を説明できる |  | ○ |
| SQL インジェクション | 最低限の知識 | 簡単に概要を説明できる | ○ | ○ |
|  | 踏み込んだ知識 | サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる | △ | ○ |
|  | 対策を実行出来る | 一般的な対策方法を実装出来る<br />ダメな対策例を説明できる |  | ○ |
| OSコマンドインジェクション | 最低限の知識 | 簡単に概要を説明できる | ○ | ○ |
|  | 踏み込んだ知識 | サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる | △ | ○ |
|  | 対策を実行出来る | 一般的な対策方法を実装出来る<br />ダメな対策例を説明できる |  | ○ |
| クロスサイト・リクエストフォージェリ（CSRF） | 最低限の知識 | 簡単に概要を説明できる | ○ | ○ |
|  | 踏み込んだ知識 | サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる | △ | ○ |
|  | 対策を実行出来る | 一般的な対策方法を実装出来る<br />ダメな対策例を説明できる |  | ○ |
| Session Fixation（セッションIDの固定化) | 最低限の知識 | 簡単に概要を説明できる | ○ | ○ |
|  | 踏み込んだ知識 | サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる | △ | ○ |
|  | 対策を実行出来る | 一般的な対策方法を実装出来る<br />ダメな対策例を説明できる |  | ○ |
| HeaderInjection攻撃 | 最低限の知識 | 簡単に概要を説明できる | ○ | ○ |
|  | 踏み込んだ知識 | サービスの内容ごとに攻撃の頻度、難易度、影響度を説明できる | △ | ○ |
|  | 対策を実行出来る | 一般的な対策方法を実装出来る<br />ダメな対策例を説明できる |  | ○ |

# 最後に
現在、全て左詰めにしていますので、生成された文字列の二行目を適当に変更して使ってください。

この方法を使うと、Qiita投稿の下書きを一旦Excelで行ってから表を適当に流し込んだりすることが楽になりますのでお試しください。

てか、Webサービス化したら便利な気がしてきた、、、、。