質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

解決済

1回答

4330閲覧

固定長テキストファイルを、指定バイト数で区切りcsvファイルにしたい

wwwww

総合スコア41

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

0クリップ

投稿2018/05/23 18:57

編集2018/05/29 16:24

前提・実現したいこと

OSX ターミナルにて、

全角文字・半角文字・半角スペースで構成された固定長テキストファイルを、指定のバイト数で区切ってcsvファイルにしたいです。

発生している問題・試したこと

入力データの文字コードを「UTF-8(LF)」にして
cat sample.csv | gawk 'BEGIN{FIELDWIDTHS="2 4 2 6 5 1 1 3 "}{print $1","$2","$3","$4”,……とすると、
全角文字を2バイトで読んでほしいところ1バイト換算になってしまい、
文字コードを「Shift_JIS (LF)」にしてから試したところ、文字ばけてしまいました。

また、cat sample.csv | sed -e ’s/^(.{2})(.{4})(.{2})(.{6})…/“\1”,”\2”,”\3”,”\……
としたら、日本語が出力から消え、スペース に謎の数値が入っていました。

追記

皆様 ご回答、ありがとうございます!

言葉足らずですいません。。
文字コードへのこだわりはありません。
バイト数が(配列の中身を考慮しており)固定で、半角文字は1バイト、全角文字は2バイトで抜き出してほしいです。加工元の固定長ファイルは、2行目以降もすべて同じバイト数で構成されています。

例えばFIELDWIDTHSが6の箇所にて、全角文字と半角スペースが混じっているため、
"あいう"という文字列の場合もあれば、("あいうえおか"で抜き出されてしまい、ここ以降がずれてしまう)
"あい "の場合もあれば、("あい うえ"が抜かれてしまう)
" "の場合もあります(" "の正しい形で抜かれる)

追記②

KojiDoi さん

早速のご回答、ありがとうございます!!

文字列が「あいう」なのにfieldwidthが5だったりする ケースが有りえる

全角文字が含まれる項目はすべて偶数になっています(全角文字を2バイトで扱わないといけない前提?)。ですので奇数の場合がありません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KojiDoi

2018/05/23 19:23

その仕様で行くと、データが途中で改行されるケースが出てくると思いますが、それでもいいのですか? UTF-8ではいわゆる全角文字は3バイト使うと思いますが、ほんとうに2バイト扱いでいいのですか?
cateye

2018/05/23 23:04

>指定のバイト数・・・は、“配列の中身を考慮してある”と、いうことですか?
wwwww

2018/05/29 14:16

ご回答ありがとうございます! 変わらず未解決なので、追記しました。解決手段あるようであれば、再度ご教授いただけないでしょうか。よろしくお願いします。
KojiDoi

2018/05/29 15:33

文字列が「あいう」なのにfieldwidthが5だったりする ケースが有りえると思いますが、どうしますか。
wwwww

2018/05/29 16:25

>KojiDoi さん 早速のご回答、ありがとうございます!! 追記させていただきました。
guest

回答1

0

ベストアンサー

バイト単位で扱いたい場合は、ロケールをCにします。
なお、UTF-8での日本語の全角は主に3バイトですが、3バイトとは限りません。

Bash

1echo "あ文字abx 123" | 2LC_ALL=C awk 'BEGIN{FIELDWIDTHS="3 6 2 1 1 3";OFS=","} 3{print $1,$2,$3,$4,$6} 4' 5#=> あ,文字,ab,x,123

投稿2018/05/24 01:56

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwwww

2018/06/02 13:59

ありがとうございました。 LC_ALL=C を追加して再度実施したところ成功しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問