web-dev-qa-db-ja.com

固定幅をCSVに変換しますか?

内容は異なるがレイアウトが同じデータファイルがたくさんあります。 CRMアプリケーションにインポートする前に、CSVに変換する必要があります。

私は通常、タブ区切りファイルをExcelで開きます。これにより、テキストインポートウィザードを使用してタブストップを手動で定義するように求められます。ファイルを開いたら、CSVに変換します。

問題は、これらのファイルがたくさんあり(たとえば20〜30)、Excelがテキストインポートで何をするかを覚えていないことですWizard)理由が長すぎてここで説明できませんデータ構造が同じであっても、それらすべてを1つの一括ファイルに結合するだけです。

データファイル構造の「テンプレート」を保存し、それを各ファイルに適用して手動で再作成する必要がないプログラムまたはプロセスがあるかどうか疑問に思っていますか?

4
Dave Mackey

このために、私は通常、スクリプト言語でバッチプロセスを使用します

たとえば、これはAutoItです。

$getfile = FileOpenDialog("Choose a file",@ScriptDir, "*.tsv",7)
If StringInSTr($getfile,"|") = 0 Then
    $split = StringSplit($getfile,"|")
    For $i = 2 to $split[0]
        $file = FileOpen($split[$i])
        StringReplace($split[$i],@TAB,",")
        FileClose($split[$i])
    Next
Else
    $file = FileOpen($getfile)
    StringReplace($file,@TAB,",")
    FileClose($file)
EndIf

これは、VBScript、Batch、Python、またはPerlでも同じように簡単です。

3
MaQleod

自由に使えるツールは何ですか?たとえば、Windows GUIに制限されていますか、それともLinuxシェルアカウントを持っていますか?任意のジャンクをダウンロードできますか、それともワークステーションにあるものに制限されていますか?

他に何もない場合は、Word /ワードパッド/メモ帳でファイルを開き、グローバル検索と置換を実行して、タブをコンマに置き換えてはどうでしょうか。または多分","、データセットにコンマが含まれている場合。

0
dannysauer

正規表現を使用して検索と置換を行うことができるため、この種のものには Textpad を使用する傾向があるため、タブをコンマに交換します。たぶん、同様のアプローチがあなたのシナリオに役立つかもしれません

0
Rob Cowell

データ列がそれぞれ1つ以上のタブで区切られている場合

Perl -p -i.bak -e "s/\t+/,/g" filenames

ここで、filenames*.tsvたとえば-またはファイル名のリスト。

データ列がスペース文字で区切られ、実際のデータのnoneにスペースが含まれている場合

Perl -p -i.bak -e "s/\s+/,/g" filenames

データにスペースを含めることができる場合は、列の位置または幅のリストに基づいて、subscriptまたはunpackを使用して少し複雑なスクリプトを記述します。実際のデータ行と望ましい結果の短い例を投稿してください。

0
RedGrittyBrick

Windowsを使用していて、 PowerShellがインストールされている の場合は、このワンライナーを使用して、現在のフォルダー内のすべての.CSVファイルを取得し、それらを「タブ区切り」( `t)ファイルとしてインポートできます。同じ名前で接頭辞「New-」が付いた実際のCSVとしてエクスポートし直します。

(get-childitem "*.csv" | foreach ($_) { ($newName="New-"+$_.name) -and (Import-Csv $_.fullname -Delimiter "`t" | Export-Csv .\$newName -notype) }) -and (Remove-Variable "newName")

明確化/スクリプト作成のために、ここでは複数の行に分割されています。

get-childitem "*.csv" | foreach ($_) { 
    $newName="New-"+$_.name
    Import-Csv $_.fullname -Delimiter "`t" | Export-Csv .\$newName -notype
    }
Remove-Variable "newName"
0