Pyon's Diary
成る可くJIS X 0213:2004對應MSフォント(5.0)、IPAフォント(003.02)で御覽下さい
2006-02-22 舊 平成拾捌年睦月廿伍日 (水・晴) [長年日記]
Ruby で Excel 仕樣の CSV 形式ファイルを讀込む。(其之壹)
Perl メモ: 値に改行コードを含む CSV 形式を扱ふのコードを Ruby に置換へてみた。最初に Perl メモのコードを出來るだけ正直に置換へてみた。
以下のコードは 3000 行、20 列の Excel 仕樣の CSV 形式ファイルを讀込み、各セルの中身から復歸・改行を取除き、「|」を区切り文字にして結合して標準出力に出力するもの。ファイルのエンコーディングは UTF-8 にした。
csv.rb
#!/usr/bin/ruby -Ku
t = Time.now
buffer = ""
ARGF.each do |line|
next if ((buffer += line).count("\x22") % 2) != 0
buffer.sub!(/(?:\x0D\x0A|[\x0D\x0A])?\Z/m, ",")
#
columns = []
while ! buffer.nil?
elm, buffer = /\A(\x22[^\x22]*(?:\x22\x22[^\x22]*)*\x22|[^,]*),(.*)?\Z/m.match(buffer).to_a[1,2]
next if ! elm
if elm.sub!(/\A\x22(.*)\x22\Z/m, "\\1")
columns << elm.gsub(/\x22\x22/, "\x22")
else
columns << elm
end
end
buffer = ""
#
columns.map!{|e| e ? e.gsub(/[\r\n]+/m, " ") : ""}
print columns.join("|") + "\n"
end
STDERR.printf("ETime: %e (sec)\n", Time.now - t)
實行結果は以下の通り。
$ ./csv.rb test.csv > output.0.txt ETime: 4.595411e+00 (sec)
次に以下の樣に正規表現を分轄して評價を行ふ樣にしてみた。
csv1.rb
#!/usr/bin/ruby -Ku
t = Time.now
buffer = ""
ARGF.each do |line|
next if ((buffer += line).count('"') % 2) != 0
buffer.sub!(/(?:\r\n|[\r\n])?\Z/mo, ',')
#
columns = []
while ! buffer.nil?
if /\A"([^"]*(?:""[^"]*)*)",/mo =~ buffer
buffer = $'
columns << $~[1].gsub(/""/, '"')
elsif /\A([^,]*),/mo =~ buffer
buffer = $'
collumns << $~[1]
else
buffer = nil
end
end
buffer = ""
#
columns.map!{|e| e ? e.gsub(/[\r\n]+/m, " ") : ""}
print columns.join("|") + "\n"
end
STDERR.printf("ETime: %e (sec)\n", Time.now - t)
此の實行結果は以下の通り。
$ ./csv1.rb test.csv > output.1.txt ETime: 2.531840e+00 (sec)
何囘か繰り返し實行してみたが、二番目の方が矢張り微妙に速かつた。此から Ruby で Excel 仕樣の CSV ファイルを讀込む必要が有る時は、此方を使ふ事にする。(其之貳へ)
GNU screen を使ふ。(其之肆)
(其之參へ) けふ初めて GNU screen で畫面分轄が出來る事を知つた。
- ^zS -- 畫面分轄。
- ^zQ -- 畫面分轄解除。
- ^zTAB -- 分轄された領域を巡囘する。
キーの組合はせが今一つ、自分には使ひ辛いが其之内慣れるでせう。(其之伍へ)
HTTP_Request (1.3.0) では HTTPS Proxy が使へない。
ウェブ頁を携帶用に變換して呉れる pc2m を調べてゐて氣が附いたのだが、PEAR の HTTP_Request 1.3.0 はソースを讀むと HTTPS Proxy に對應してゐなかつた。
604 // 4.3.0 supports SSL connections using OpenSSL. The function test determines
605 // we running on at least 4.3.0
606 if (strcasecmp($this->_url->protocol, 'https') == 0 AND function_exists('file_get_contents') AND extension_loaded('openssl')) {
607 if (isset($this->_proxy_host)) {
608 return PEAR::raiseError('HTTPS proxies are not supported.');
609 }
610 $host = 'ssl://' . $host;
611 }
此が駄目だと嚴しいな。自力で何とかするのも面倒臭いし。
追記: 1.4.0 では。(2006-11-02)
HTTP_Request の 1.4.0 が出てゐた事に氣が附いたので、ソースを眺めて診たが、矢張り HTTPS Proxy には對應してゐ無かつた。
Google で情報を探してみたら、
と云ふ記事を見附けて仕舞つた。端から對應出來無い模樣。CURL を使へ、と囘答されてゐる。
[ツッコミを入れる]
[]