将电子表格列字符串转换为整数的库

笔者の过去のブログ(例えばこれ)を见ていただければ分かるように,试算表を使ったツールをよく作成成しております,そして毎回思うことなのですが,カラム文字列を数値で定义するのが,地味に面倒なんです。具体的にはこんなコードです。
const(
columnMail = 3 // D
)
また,数が多いと最初の设定だけで忧郁。そこで今回は,これを解决するためにライブラリを作っそ。その名もclmconv 。
takuoki / clmconv
用于转换为电子表格列字母或数字的golang软件包– takuoki / clmconv github.com
使い方
使のはーパいたって简単です。 "A"は0を返します。
i,err:= clmconv.Atoi(“ A”)// i = 0
こちらはerrorを受け取らなくて済むよう, MustAtoiも用意しています。こちらは,変换できない文字列が指定された场合, panicします。
i:= clmconv.MustAtoi(“ A”)// i = 0
も纯な26进数になるかと思いきやそうでもなくて,ちょっと苦戦しました。
a:= clmconv.Itoa(0)// a =“ A”
なお,こちらは1から始まるので,全て1ずつ结果がずれています。ちなみに,こちらは桁が大きくなると丸められてclmconvいます。
Goのベンチマークで注意すること
ライブラリ作成中,ベンチマークを测っている时に,少し気になったことがあったので,备忘として残しておきます。帰。再帰处理のため,メモ化した方が速いかな?でも,そんな大きい数の累乘はほとんど计算しないから,メモ化しない方がいいかな?と迷ったので,ベンチマークを测ってみました。
计测したのは,メモ化なしのPow26とメモ化ありのPow26WithMemo 。あと,テストパッケージ内に同じ关数を用意し, Innerという接尾语を追加したものの,计4つです。実行毎に多少ばらつきますが,だいたいこんな感じです。
BenchmarkPow26-4 20000000 77.5 ns / op BenchmarkPow26Inner-4 30000000 51.4 ns / op BenchmarkPow26WithMemo-4 30000000 62.5 ns / op BenchmarkPow26WithMemoInner-4 30000000 50.1 ns / op
実际に使用しない方は,テストパッケージ内ジ书けばいいかと思っていたのですが,上の结果から分かる通り,パッケージまたぎの呼び出しで结构しでーバーヘッドがかかっています。厳密にチューニングする际グする,これらの条件も揃えてテストしてあげないといけないということですね。
最终的には, math.Pow10を参考に,下记のような実装にしました。
var pow26tab = [int] {1,26,676,17576,456976,11881376}
func pow26(n int)int {
如果0 <= n && n <= 5 {
返回pow26tab [n]
}
返回pow26(n-1)* 26
}
いンチマーク结果はこちら。いい感じに早くなっていますね!
BenchmarkPow26-4 50000000 29.2 ns / op BenchmarkPow26Inner-4 100000000 17.5 ns / op