Ruby Cadet Club #4

Original 2000-01-31, by guel

[ruby] RPN 電卓 4版

WK1 のフォーマットをあれこれ調べている副産物で CSV ファイルから WK1 へ
のコンバータができました。
もちろん、ツールは Ruby です。:-)

% ruby csv2wk1.rb takako.csv > matu.wk1

の様にして使います。

対応:1-2-3 Worksheet (WK1)


#-------------------------------------------------------------- csv2wk1.rb ^
#  CSV > WK1 (LX 1-2-3) 変換 ruby script, 2000-01-31 by guel


print [0, 0, 2, 0, 6, 4].pack("C6")

row = 0

while gets
  chomp
  col = 0

  split(",").each do |x|
    if x != '' then

      if x =~ /^\-?\d+$/ and x.to_i.abs < 32767 then       # 整数: 16bit
        x = Array[x.to_i].pack("s")                        # short int
        print [0xD, 0, 7, 0, 0, col, 0, row, 0].pack("C9"), x

      elsif x =~ /^\-?\d*(\.\d+)?(e(\+|\-)?\d*)?$/         # 実数: 64 bit
        x = Array[x.to_f].pack("d")                        # double float
        print [0xE, 0, 13, 0, 0x12, col, 0, row, 0].pack("C9"), x

      else
        len = x.length + 7                                 # 文字列
        print [0xF, 0, len, 0, 0xFF, col, 0, row, 0].pack("C9"), \
              "'" + x, [0].pack("C")
      end

    end
    col += 1
  end

  row += 1
end

print [1, 0, 0, 0].pack("C4")

#-------------------------------------------------------------- csv2wk1.rb $


1-2-3 WK1 file format
---------------------
WK1 file は,可変長レコードの集合体です。

それぞれのレコードは,Record Header + Record Body で,後者の長さは不定です。
前者の構造は,


typedef struct sRecHeader {
    int type;               // Record Type
    int len;                // Record Body Length
} RECORDHEADER;

であり,後者の長さの情報が含まれています。

Record Type ですが,以下のような型があります。


typedef enum RecType {
    BOF         = 0x0,      // Beginning of file 
    EOF         = 0x1,      // End of file 
    CALCMODE    = 0x2,      // Calculation mode  
    CALCORDER   = 0x3,      // Calculation order  
    SPLIT       = 0x4,      // Split window type 
    SYNC        = 0x5,      // Split window sync 
    RANGE       = 0x6,      // Active worksheet range 
    WINDOW1     = 0x7,      // Window 1 record 
    COLW1       = 0x8,      // Column width, window 1
    WINTWO      = 0x9,      // Window 2 record 
    COLW2       = 0xA,      // Column width, window 2
    NAME        = 0xB,      // Named range  
    BLANK       = 0xC,      // Blank cell  
    INTEGER     = 0xD,      // Integer number cell 
    NUMBER      = 0xE,      // Floating point number 
    LABEL       = 0xF,      // Label cell  
    FORMULA     = 0x10,     // Formula cell  
    TABLE       = 0x18,     // Data table range 
    ORANGE      = 0x19,     // Query range  
    PRANGE      = 0x1A,     // Print range  
    SRANGE      = 0x1B,     // Sort range  
    FRANGE      = 0x1C,     // Fill range  
    KRANGE1     = 0x1D,     // Primary sort key range
    HRANGE      = 0x20,     // Distribution range  
    KRANGE2     = 0x23,     // Secondary sort key range
    PROTEC      = 0x24,     // Global protection  
    FOOTER      = 0x25,     // Print footer  
    HEADER      = 0x26,     // Print header  
    SETUP       = 0x27,     // Print setup  
    MARGINS     = 0x28,     // Print margins code 
    LABELFMT    = 0x29,     // Label alignment  
    TITLES      = 0x2A,     // Print borders  
    GRAPH       = 0x2D,     // Current graph settings 
    NGRAPH      = 0x2E,     // Named graph settings 
    CALCCOUNT   = 0x2F,     // Iteration count  
    UNFORMATTED = 0x30,     // Formatted/unformatted print  
    CURSORW12   = 0x31,     // Cursor location  
} RECORDTYPE;


Count ->

update 2000-06-21, since 2000-06-21
Copyright (c) 2000
by guel. All rights reserved.