(57)【要約】【課題】インデックスリストを用いた効率的なデータ参照・編集等、更に行単位／列単位でデータの追加／挿入／削除操作を可能とする。【解決手段】インデックスリスト１３は、各データに対応する各リスト要素が先頭から順次シリアルに連結されている。また、最大列番号が記憶されている。任意の（行番号，列番号）のデータにアクセスする場合、“最大列番号×（行番号−１）＋列番号”によって、上記データに対応するリスト要素３０の番号（先頭のリスト要素３０からの順番）を求めることで、上記データにアクセスできる。また、追加／挿入すべき行単位／列単位のデータに対応するリストの所定の１以上のリスト要素３０を、インデックスリスト１３の所定の１以上のリスト要素３０と連結することで、行単位／列単位でデータの追加／挿入／削除操作を可能とする。【選択図】      図３
2010020643.tif 000002
【特許請求の範囲】
【請求項１】
ＣＳＶ形式で行、列が表されるデータ群を格納したデータファイルの各データ毎に対応する複数のリスト要素から成り、該各リスト要素が、自要素が対応するデータへのポインタであるデータポインタと、自要素の直前のリスト要素へのポインタである前リスト要素ポインタと、自要素の直後のリスト要素へのポインタである次リスト要素ポインタとを保持しており、該前リスト要素ポインタ、次リスト要素ポインタによって各リスト要素が相互に連結され、前記データ群の最初のデータに対応するリスト要素から最後のデータに対応するリスト要素まで順次シリアルに連結された構成のインデックスリストを生成するインデックスリスト生成手段と、
前記データファイルのデータ群の列数を最大列番号Ｎとして記憶する最大列番号記憶手段と、
前記データファイルのｍ行ｎ列目のデータが指定されると、該指定と前記最大列番号Ｎとを用いて「ｐ＝Ｎ×（ｍ−１）＋ｎ」を算出することで、前記シリアル連結されたリスト要素群の先頭からｐ番目のリスト要素を取得し、該取得したリスト要素の前記データポインタによって前記指定されたデータにアクセスするデータアクセス手段と、
を有することを特徴とするデータファイル操作システム。
【請求項２】
前記データファイルのデータ群に対して行単位または列単位でデータ追加する為に、該追加する行データまたは列データに対応するリスト要素群の所定の１以上のリスト要素を、前記インデックスリストの所定の１以上のリスト要素に連結する追加処理手段を更に有することを特徴とする請求項１記載のデータファイル操作システム。
【請求項３】
前記追加処理手段は、前記データファイルのデータ群に対する１行以上の行データの追加要求があると、該行データの各データに対応する前記リスト要素である追加リスト要素が、該行データの最初のデータに対応する追加リスト要素から最後のデータに対応する追加リスト要素まで順次シリアルに連結された構成の追加リストを用いて、前記インデックスリストの最後のリスト要素と前記追加リストの最初の追加リスト要素とを連結することで、該追加リストを前記インデックスリストに追加することを特徴とする請求項２記載のデータファイル操作システム。
【請求項４】
前記追加処理手段は、前記データファイルのデータ群に対する１列以上の列データの追加要求があると、該列データの各データに対応する前記リスト要素である追加リスト要素が、該列データの最初のデータに対応する追加リスト要素から最後のデータに対応する追加リスト要素まで順次シリアルに連結された構成の追加リストを用いて、前記データ群の各行毎に、この行の最後の列のデータに対応するリスト要素とこの行の次の行の先頭列データに対応するリスト要素の各々に対して、この行の最後に追加すべき１以上の追加リスト要素を連結することで、前記追加リストを前記インデックスリストに追加することを特徴とする請求項２記載のデータファイル操作システム。
【請求項５】
前記データファイルのデータ群の任意の挿入箇所に対して行単位または列単位でデータ挿入する為に、該挿入する行データまたは列データに対応するリスト要素群の所定の１以上のリスト要素を、前記インデックスリストの前記挿入箇所に係る所定の１以上のリスト要素に連結する挿入処理手段を更に有することを特徴とする請求項１記載のデータファイル操作システム。
【請求項６】
前記挿入処理手段は、前記データファイルのデータ群の任意の挿入箇所への１行以上の行データの挿入要求があると、該行データの各データに対応する前記リスト要素である挿入リスト要素が、該行データの最初のデータに対応する挿入リスト要素から最後のデータに対応する挿入リスト要素まで順次シリアルに連結された構成の挿入リストを用いて、前記挿入箇所の直前の行の最後の列のデータに対応するリスト要素と前記挿入リストの最初の挿入リスト要素とを連結すると共に、前記挿入箇所の直後の行の先頭の列のデータに対応するリスト要素と前記挿入リストの最後の挿入リスト要素とを連結することで、該挿入リストを前記インデックスリストの前記挿入箇所に挿入することを特徴とする請求項５記載のデータファイル操作システム。
【請求項７】
前記挿入処理手段は、前記データファイルのデータ群の任意の挿入箇所への１列以上の列データの挿入要求があると、該列データの各データに対応する前記リスト要素である挿入リスト要素が、該列データの最初のデータに対応する挿入リスト要素から最後のデータに対応する挿入リスト要素まで順次シリアルに連結された構成の挿入リストを用いて、前記データ群の各行毎に、この行における前記挿入箇所の直前と直後の列のデータに対応するリスト要素各々に対して、この行に挿入すべき１以上の追加リスト要素を連結することで、前記挿入リストを前記インデックスリストの前記挿入箇所に挿入することを特徴とする請求項５記載のデータファイル操作システム。
【請求項８】
前記データファイルのデータ群の任意の１以上の行または１以上の列のデータを削除する為に、該削除する行または列のデータに対応するリスト要素群に関して前記連結を解除することで、該リスト要素群を前記インデックスリストから削除する削除処理手段を更に有することを特徴とする請求項１記載のデータファイル操作システム。
【請求項９】
前記追加処理手段または挿入処理手段または削除処理手段による処理によって更新されたインデックスリストに基づいて、該更新後のインデックスリストの内容に対応するデータファイルを生成するデータファイル生成手段を更に有することを特徴とする請求項２〜８の何れかに記載のデータファイル操作システム。
【請求項１０】
ＣＳＶ形式で行、列が表されるデータ群を格納したデータファイルの各データ毎に対応する複数のリスト要素から成り、該各リスト要素が、自要素が対応するデータへのポインタであるデータポインタと、自要素に対応するデータの直前の列と直後の列の各データに対応するリスト要素へのポインタである前列リスト要素ポインタ、次列リスト要素ポインタと、自要素に対応するデータの直前の行と直後の行の各データに対応するリスト要素へのポインタである前行リスト要素ポインタ、次行リスト要素ポインタとを保持可能としており、各リスト要素が、該４種類のリスト要素ポインタのうちの１以上のリスト要素ポインタを保持し、保持しているリスト要素ポインタによって１以上の他のリスト要素と連結された構成のインデックスリストを生成するインデックスリスト生成手段と、
前記データファイルのｍ行ｎ列のデータが指定されると、特定のリスト要素を起点として、前記次行リスト要素ポインタまたは次列リスト要素ポインタによって順次連結先のリスト要素を辿っていくことで前記指定されたデータに対応するリスト要素を求め、該求めたリスト要素の前記データポインタによって前記指定されたデータにアクセスするデータアクセス手段と、
を有することを特徴とするデータファイル操作システム。
【請求項１１】
前記データファイルのデータ群に対して行単位または列単位でデータ追加する為に、該追加する行データまたは列データに対応するリスト要素群の所定の１以上のリスト要素を、前記インデックスリストの所定の１以上のリスト要素に連結する追加処理手段を更に有することを特徴とする請求項１０記載のデータファイル操作システム。
【請求項１２】
前記データファイルのデータ群の任意の挿入箇所に対して行単位または列単位でデータ挿入する為に、該挿入する行データまたは列データに対応するリスト要素群の所定の１以上のリスト要素を、前記インデックスリストの前記挿入箇所に係る所定の１以上のリスト要素に連結する挿入処理手段を更に有することを特徴とする請求項１０記載のデータファイル操作システム。
【請求項１３】
前記データファイルのデータ群の任意の１以上の行または１以上の列のデータを削除する為に、該削除する行または列のデータに対応するリスト要素群に関して前記連結を解除することで、該リスト要素群を前記インデックスリストから削除する削除処理手段を更に有することを特徴とする請求項１０記載のデータファイル操作システム。
【請求項１４】
前記追加処理手段または挿入処理手段または削除処理手段による処理によって更新されたインデックスリストに基づいて、該更新後のインデックスリストの内容に対応するデータファイルを生成するデータファイル生成手段を更に有することを特徴とする請求項１１〜１３の何れかに記載のデータファイル操作システム。
【請求項１５】
任意のデータファイルのデータの操作を行う装置のコンピュータを、
ＣＳＶ形式で行、列が表されるデータ群を格納した前記データファイルの各データ毎に対応する複数のリスト要素から成り、該各リスト要素が、自要素が対応するデータへのポインタであるデータポインタと、自要素の直前のリスト要素へのポインタである前リスト要素ポインタと、自要素の直後のリスト要素へのポインタである次リスト要素ポインタとを保持しており、該前リスト要素ポインタ、次リスト要素ポインタによって各リスト要素が相互に連結され、前記データ群の最初のデータに対応するリスト要素から最後のデータに対応するリスト要素まで順次シリアルに連結された構成のインデックスリストを生成するインデックスリスト生成手段と、
前記データファイルのデータ群の列数を最大列番号Ｎとして記憶する最大列番号記憶手段と、
前記データファイルのｍ行ｎ列目のデータが指定されると、該指定と前記最大列番号Ｎとを用いて「ｐ＝Ｎ×（ｍ−１）＋ｎ」を算出することで、前記シリアル連結されたリスト要素群の先頭からｐ番目のリスト要素を取得し、該取得したリスト要素の前記データポインタによって前記指定されたデータにアクセスするデータアクセス手段、
として機能させるためのプログラム。
【請求項１６】
任意のデータファイルのデータの操作を行う装置のコンピュータを、
ＣＳＶ形式で行、列が表されるデータ群を格納した前記データファイルの各データ毎に対応する複数のリスト要素から成り、該各リスト要素が、自要素が対応するデータへのポインタであるデータポインタと、自要素に対応するデータの直前の列と直後の列の各データに対応するリスト要素へのポインタである前列リスト要素ポインタ、次列リスト要素ポインタと、自要素に対応するデータの直前の行と直後の行の各データに対応するリスト要素へのポインタである前行リスト要素ポインタ、次行リスト要素ポインタとを保持可能としており、各リスト要素が、該４種類のリスト要素ポインタのうちの１以上のリスト要素ポインタを保持し、保持しているリスト要素ポインタによって１以上の他のリスト要素と連結された構成のインデックスリストを生成するインデックスリスト生成手段と、
前記データファイルのｍ行ｎ列のデータが指定されると、特定のリスト要素を起点として、前記次行リスト要素ポインタまたは次列リスト要素ポインタによって順次連結先のリスト要素を辿っていくことで前記指定されたデータに対応するリスト要素を求め、該求めたリスト要素の前記データポインタによって前記指定されたデータにアクセスするデータアクセス手段、
として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＣＳＶファイル等のデータファイル上のデータの参照や編集等を簡便に行う為の装置等に関する。
【背景技術】
【０００２】
データのファイル保存形式として、表形式のデータをカンマなどの区切り記号で区切って表現したＣＳＶ形式がある。ＣＳＶ形式のデータファイルは、テキスト形式で保存されており、専用のソフトウェアがなくてもＯＳ付属のテキストエディタ等で参照・編集などの操作が行えるため、汎用性が高く、広く利用されている。
【０００３】
しかし、ＣＳＶ形式のデータファイルの操作は、ファイル先頭からの絶対位置、あるいはファイル中のある基準点からの相対位置から、区切り記号及び改行記号を検出し、所望の座標のデータを見つけ出して、操作するので、行単位あるいは列単位などのあるまとまったデータ単位での操作処理は極めて煩雑となる。
【０００４】
また、操作対象となるデータファイルのサイズ又はデータファイルに登録されたデータ件数に応じて、操作に要する時間は変動する。一般的に、データファイルのサイズ又はデータ件数が増大すれば、操作に要する時間も増大する傾向にある。
【０００５】
このような問題に関して、例えば特許文献１記載の従来技術が知られている。
図２８は、特許文献１記載の従来技術を説明する為の図である。
特許文献１記載の方式では、主にデータベースから検索した結果を出力したＣＳＶファイルを対象としている。本方式によれば、ＣＳＶファイルを解析し、冗長な情報を省いたインデックスファイルを作成しておき、そのインデックスファイルを参照して、データファイル上のデータそのものを参照する。この方式の結果、サイズの大きいデータファイルから素早く且つ効率的に所望のデータを参照することができる。
【特許文献１】特開２００３−１６２５４５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかし、特許文献１記載の方法によって生成されるインデックスファイルは、データファイルの検索・参照を素早く且つ効率的に行うことにのみ特化しており、データファイル中のデータを追加・削除する等のデータ操作を行うことは考慮されていないという問題がある。
【０００７】
本発明の課題は、ＣＳＶ形式のデータファイル上のデータと関連付けたインデックスリストを生成し、生成したインデックスリストに対して操作を行うことによって、データファイル上の個々のデータに対する参照・編集等を素早く且つ効率的に行うことができ、更にデータファイルに対する行単位／列単位でのデータ追加／挿入／削除操作を可能とするデータファイル操作システム等を提供することである。
【課題を解決するための手段】
【０００８】
本発明の第１のデータファイル操作システムは、ＣＳＶ形式で行、列が表されるデータ群を格納したデータファイルの各データ毎に対応する複数のリスト要素から成り、該各リスト要素が、自要素が対応するデータへのポインタであるデータポインタと、自要素の直前のリスト要素へのポインタである前リスト要素ポインタと、自要素の直後のリスト要素へのポインタである次リスト要素ポインタとを保持しており、該前リスト要素ポインタ、次リスト要素ポインタによって各リスト要素が相互に連結され、前記データ群の最初のデータに対応するリスト要素から最後のデータに対応するリスト要素まで順次シリアルに連結された構成のインデックスリストを生成するインデックスリスト生成手段と、前記データファイルのデータ群の列数を最大列番号Ｎとして記憶する最大列番号記憶手段と、前記データファイルのｍ行ｎ列目のデータが指定されると、該指定と前記最大列番号Ｎとを用いて「ｐ＝Ｎ×（ｍ−１）＋ｎ」を算出することで、前記シリアル連結されたリスト要素群の先頭からｐ番目のリスト要素を取得し、該取得したリスト要素の前記データポインタによって前記指定されたデータにアクセスするデータアクセス手段とを有する。
【０００９】
上記第１のデータファイル操作システムによれば、各々がデータファイルにおける１件のデータに対応するリスト要素が、シリアルに連結された構造のインデックスリストを用いて、所望のデータに素早く且つ効率的にアクセスすることができる。
【００１０】
また、上記構造のインデックスリストを用いれば、データファイルに対する行単位／列単位でのデータ追加／挿入／削除操作を容易に行うことができる。
すなわち、例えば、前記データファイルのデータ群に対して行単位または列単位でデータ追加する為に、該追加する行データまたは列データに対応するリスト要素群の所定の１以上のリスト要素を、前記インデックスリストの所定の１以上のリスト要素に連結する追加処理手段を更に有する。
【００１１】
上記のようにインデックスリストに対して、追加する行データまたは列データに対応するリスト要素群を連結することで、実質的に、これら行データまたは列データがデータファイルのデータ群に追加されたものとなる。これは、挿入等に関しても同様である。
【００１２】
例えば、前記データファイルのデータ群の任意の挿入箇所に対して行単位または列単位でのデータ挿入する為に、該挿入する行データまたは列データに対応するリスト要素群の所定の１以上のリスト要素を、前記インデックスリストの前記挿入箇所に係る所定の１以上のリスト要素に連結する挿入処理手段を更に有する。
【００１３】
あるいは、例えば、前記データファイルのデータ群の任意の１以上の行または１以上の列のデータを削除する為に、該削除する行または列のデータに対応するリスト要素群に関して前記連結を解除することで、該リスト要素群を前記インデックスリストから削除する削除処理手段を更に有する。
【００１４】
上記の通り、追加／更新／削除処理によりインデックスリストを更新することで、データファイルも実質的に更新されたものとなり、更新後のインデックスリストを用いて問題なく所望のデータにアクセスできる。勿論、追加等したデータにもアクセスでき、あるいは削除したデータにはアクセスできない。但し、例えば、削除処理によって削除したデータは、実際には未だデータファイル内に残っており、インデックスリスト上では削除されたものとして管理されている。これは、追加／更新処理に関しても略同様である。
【００１５】
これに対して、例えば、前記追加処理手段または挿入処理手段または削除処理手段による処理によって更新されたインデックスリストに基づいて、該更新後のインデックスリストの内容に対応するデータファイルを生成するデータファイル生成手段を更に有する。
【００１６】
例えば削除処理に関しては、上記削除処理手段によるインデックスリスト更新によって実質的に削除されたものとなっていたデータが、データファイル生成手段によって生成されたデータファイルにおいては削除されていることになる。
【００１７】
また、本発明の第２のデータファイル操作システムは、ＣＳＶ形式で行、列が表されるデータ群を格納したデータファイルの各データ毎に対応する複数のリスト要素から成り、該各リスト要素が、自要素が対応するデータへのポインタであるデータポインタと、自要素に対応するデータの直前の列と直後の列の各データに対応するリスト要素へのポインタである前列リスト要素ポインタ、次列リスト要素ポインタと、自要素に対応するデータの直前の行と直後の行の各データに対応するリスト要素へのポインタである前行リスト要素ポインタ、次行リスト要素ポインタとを保持可能としており、各リスト要素が、該４種類のリスト要素ポインタのうちの１以上のリスト要素ポインタを保持し、保持しているリスト要素ポインタによって１以上の他のリスト要素と連結された構成のインデックスリストを生成するインデックスリスト生成手段と、前記データファイルのｍ行ｎ列のデータが指定されると、特定のリスト要素を起点として、前記次行リスト要素ポインタまたは次列リスト要素ポインタによって順次連結先のリスト要素を辿っていくことで前記指定されたデータに対応するリスト要素を求め、該求めたリスト要素の前記データポインタによって前記指定されたデータにアクセスするデータアクセス手段とを有する。
【００１８】
上記第２のデータファイル操作システムも、上記第１のデータファイル操作システムと略同様に、インデックスリストを用いてデータファイルの所望のデータにアクセスすることができ、また、インデックスリストに対して、行データ／列データに対応するリスト要素群を連結することで、データファイルに対して行単位／列単位でのデータ追加／挿入を行うことができる。あるいは、行単位／列単位でのデータ削除を行うことができる。
【発明の効果】
【００１９】
本発明のデータファイル操作システム等によれば、ＣＳＶ形式のデータファイル上のデータと関連付けたインデックスリストを生成し、生成したインデックスリストに対して操作を行うことによって、データファイル上の個々のデータに対する参照・編集等を素早く且つ効率的に行うことができ、更にデータファイルに対する行単位／列単位でデータの追加／挿入／削除操作を可能とする。
【発明を実施するための最良の形態】
【００２０】
以下、図面を参照して本発明の実施の形態について説明する。
図１は、実施例１に係るデータファイル操作システムの構成図である。
図示のデータファイル操作システムは、データファイル操作部１０とデータファイル２０から成る。データファイル２０は、任意のデータベース装置（記憶装置）に記憶されている。データファイル操作部１０は、例えば各種ＣＳＶファイル利用処理群からの要求に応じて、データファイル２０の操作（データ参照／更新等、あるいは行単位／列単位でのデータ追加、挿入、削除等）と、これに伴うインデックスリスト１３の操作を行う。
【００２１】
尚、データファイル２０におけるデータ格納形式は、ＣＳＶ形式であるものとする。すなわち、よく知られているように、各データ間を区切り記号で区切り、更に各行の最後に改行記号を記すことにより、Ｍ行Ｎ列のデータを表すものである。尚、一般的には、ＣＳＶ形式は区切り記号がカンマ（，）であるものであるが、この例に限らず、区切り記号が例えばスペースや他の記号であってもよく、ここではこの様なものもＣＳＶ形式と呼ぶものとする。これは、後述するデータファイル６０においても同様である。
【００２２】
データファイル操作部１０は、データファイル−インデックスリスト変換処理部１１と、インデックスリスト操作処理部１２を有する。また、インデックスリスト１３と最大列番号を記憶している。尚、最大列番号はインデックスリスト１３に含まれていてよい。
【００２３】
インデックスリスト１３は、図２に示すようなデータ構成のリスト要素３０を複数用いて、例えば図３に示すように構成される。
図２に示すように、リスト要素３０は、データファイル２０内に格納されるデータ群のうちの任意の一つのデータへのポインタ３１（以下、データポインタ３１という）と、インデックスリストにおける自要素の１つ前のリスト要素３０へのポインタ３２（以下、前リスト要素ポインタ３２という）と、インデックスリストにおける自要素の1つ次のリスト要素３０へのポインタ３３（以下、次リスト要素ポインタ３３という）とで構成されている。この他にも、リスト要素３０として必要な情報があれば、追加しても構わない。例えば、各リスト要素３０は自要素へのポインタ情報やインデックスリストにおける自要素の順番（先頭から何番目であるか）等の情報を更に保持していてもよい。
【００２４】
インデックスリスト１３は、図３に示すようなリスト構造であり、図示の矩形の１つ１つが上記リスト要素３０を意味する。データファイル２０に記述されているデータ１件に対して1つのリスト要素３０が割り当てられている。また、矩形内の記号（ｍ，ｎ）（ｍ，ｎ；正の整数）は、データファイル２０におけるｍ行ｎ列目のデータに対応するリスト要素３０であることを意味しており、例えば図示の（２，１）は、データファイル２０における２行１列目のデータに対応するリスト要素３０であることを意味している。
【００２５】
但し、これは、分かり易くする為に示しているだけであり、上記図２に示すように、リスト要素３０には自要素が何行何列のデータに対応するのかを示すデータは保持されていない。例えば２行１列目のデータにアクセス（参照、更新等）したい場合には、後述する（１）式により、（図３の例では最大列番号＝‘５’となるので）「５×（２−１）＋１」＝６番目（先頭から６番目）のリスト要素３０を取得して、そのデータポインタ３１を参照すれば良い。
【００２６】
尚、例えば上記の例の２行１列目のデータに対応するリスト要素３０を“（２，１）リスト要素”等と呼ぶ場合もある。
インデックスリスト１３は、図３に示すように、上記リスト要素３０が１つずつシリアルに連結された構成となっている。よって、図示のように、リスト要素３０群の各リスト要素は、リスト要素３０群の先頭と最後のリスト要素を除いて全て、自要素の１つ前と１つ後のリスト要素３０に連結されている。この連結を示す情報が、上記前リスト要素ポインタ３２と次リスト要素ポインタ３３である。例えば上記“（２，１）リスト要素”は、その１つ前の“（１，５）リスト要素”と、その１つ後の“（２，２）リスト要素”に連結している。図３に示す各矢印が、上記連結を意味するが、ここでの矢印は次リスト要素ポインタ３３による連結を示している。これは、他の同様の図面（例えば図５（ｂ）等）においても同様である。
【００２７】
インデックスリスト１３を構成するリスト要素３０群の先頭のリスト要素３０すなわち図示の“（１，１）リスト要素”は、例えばＭ行Ｎ列のデータ構成のデータファイル２０における１行１列目のデータに対応するリスト要素３０であり、これを起点にして、１行１列目から1行2列目、1行3列目・・・と列方向での各データに対応するリスト要素３０が連結している。１行目の最後の列に達した場合、次の行（２行目）の先頭列のデータに対応するリスト要素３０に連結し、この２行目に関しても上記１行目と同様に列方向の各データに対応するリスト要素３０を連結していく。３行目以降についても同様である。
【００２８】
すなわち、例えばＭ行Ｎ列のデータ構成のデータファイル２０の各行単位にその行の１列目のデータから最後の列のデータまで順番に各データに対応するリスト要素３０を連結していき、最後の列のデータに対応するリスト要素３０は次の行の１列目のデータに対応するリスト要素３０に連結する。例えば１行５列目データに対応するリスト要素３０は、2行目先頭すなわち2行1列目のリスト要素３０に連結している。このようにして、最初のデータ（１行１列目のデータ）に対応するリスト要素３０から最後のデータ（Ｍ行Ｎ列目のデータ）に対応するリスト要素まで、リスト要素３０が順次シリアルに連結された構成のインデックスリスト１３が生成されることになる。
【００２９】
また、データファイル２０のデータ群の列数が最大列番号として記憶される。つまり、Ｍ行Ｎ列のデータ構成のデータファイル２０に関して、最大列番号＝Ｎが記憶される。図３は、５列のデータ構成よりなるデータファイル２０に対応するインデックスリスト１３の例であるので、最大列番号＝‘５’となることになる。
【００３０】
最大列番号は、後述するインデックスリスト生成処理でデータファイル２０を解析した際に設定されるが、データを追加・挿入・削除した際にも、最大列番号の値は必要に応じて更新される。
【００３１】
上記の通り、リスト要素３０は自要素が何行何列目のデータに対応するものであるかを示すデータは保持していないが、自要素が先頭の要素から何番目であるかは分かるので（例えば先頭から上記連結された各リスト要素３０を辿っていくことで分かるので）、例えば各リスト要素３０は自要素が先頭から何番目であるかの情報（先頭からの順番）も保持しておき、これと最大列番号とを用いることで、以下に説明するように、任意のｍ行ｎ列目のデータに対応するリスト要素３０を特定することができ、このリスト要素３０を用いて対応するデータにアクセスでき、このデータの参照、更新等の処理を行うことができる。
【００３２】
すなわち、インデックスリスト１３を用いて所望のデータを参照等する際には、例えば図１に示すＣＳＶファイル利用処理群等は、（行、列）により所望のデータを指定する。つまり、例えばデータ参照処理の場合には（参照行番号、参照列番号）により任意のデータを指定する。この指定に応じて、データファイル操作部１０（図１には示さないが、例えばデータ参照・更新部のような機能部が存在するものとする）は、まず、以下の（１）式によりインデックスリスト１３から該当するリスト要素３０を取得する。すなわち、
“最大列番号×（参照行番号−１）＋参照列番号”・・・(１)式
によって、該当するリスト要素３０の番号（上記先頭からの順番）を求めることで、該当するリスト要素３０を特定できるので、このリスト要素３０を取得してそのデータポインタ３１を用いることで、上記指定されたデータの記憶位置にアクセスしてこれを参照することができる。勿論、データ参照の場合に限らず、データ更新等の場合も同様である。
【００３３】
よって、上記（１）式は、参照の場合に限らない形として、任意の（行番号、列番号）のデータが指定された場合に“最大列番号×（行番号−１）＋列番号”によって、上記指定されたデータに対応するリスト要素３０の番号（先頭のリスト要素３０からの順番）を求めるものであると言える。
【００３４】
例えば、図３に示す最大列番号＝‘５’のインデックスリスト１３に係るデータファイル２０に関して、その３行４列目のデータを参照したい場合には、インデックスリスト１３において「５×（３−１）＋４」＝１４番目のリスト要素３０を取得して、そのデータポインタ３１を参照すれば良い。
【００３５】
データファイル−インデックスリスト変換処理部１１は、インデックスリスト生成処理や、データファイル保存処理等を実行する。インデックスリスト生成処理は、データファイル２０からインデックスリスト１３を生成する処理である。データファイル保存処理は、インデックスリスト１３（特に更新後）の内容をデータファイル２０に反映させて保存する処理である。
【００３６】
図４は、インデックスリスト生成処理の処理フローチャート図である。
図示の例では、まず、任意のデータファイル２０をオープンする（ステップＳ１１）。
そして、このデータファイル２０から１行分のデータを取得する毎に（ステップＳ１２）、ステップＳ１３以降の処理を実行する。
【００３７】
これは、まず、取得したデータがＥＯＦであるか否か、すなわちデータファイル２０のデータ群の最後尾であるかどうかを確認する（ステップＳ１３）。データファイル２０の最後尾であった場合（ステップＳ１３，ＹＥＳ）、本インデックスリスト生成処理で生成したインデックスリスト１３の最後尾すなわちシリアル連結されるリスト要素群の最後尾のリスト要素３０における次リスト要素ポインタ３３に“EOF”を登録して（ステップＳ１４）、データファイル２０をクローズして（ステップＳ１５）、インデックスリスト生成処理を終了する。
【００３８】
データファイル２０の最後尾でなかった場合（ステップＳ１３，ＮＯ）、ステップＳ１２で取得した１行分のデータ群の行末に達したか否かを判定する（ステップＳ１６）。行末は、データファイル２０のフォーマットで予め決められた改行コードを検出することで判断する。
【００３９】
行末に達するまでは（ステップＳ１６の判定がＮＯである限りは）、ステップＳ１２で取得した１行分のデータ群の各データ毎に、ステップＳ１７〜Ｓ１９の処理を繰り返し実行する。すなわち、処理対象のデータに対応するリスト要素３０（新規生成リスト要素３０’というものとする）を新たに追加生成する処理を実行する。これは、まず、新規生成リスト要素３０’のデータポインタ３１に、処理対象のデータへのポインタ（アドレス等）を格納する（ステップＳ１７）。もし、処理対象のデータが空欄であれば、空欄であることを示す識別データを格納する。この識別データは、データが空欄であることを判別できればどのようなものでも構わない。本実施例では、データが空欄であることを示す識別データとして”NULL”を格納するものとする。
【００４０】
次に、新規生成リスト要素３０’の１つ前のリスト要素３０の次リスト要素ポインタ３３に、新規生成リスト要素３０’自身へのポインタを登録する（ステップＳ１８）。更に、新規生成リスト要素３０’の前リスト要素ポインタ３２に、上記“１つ前のリスト要素３０”へのポインタを登録する（ステップＳ１９）。尚、上記“新規生成リスト要素３０’の１つ前のリスト要素３０”は、例えばここまでの処理で最後に生成したリスト要素３０であり、その次リスト要素ポインタ３３には未だポインタが登録されていないものである。
【００４１】
行末に達したと判定した場合（ステップＳ１６，ＹＥＳ）、上記ステップＳ１２で取得した１行分のデータ群のデータ数を、最大列番号として登録する（ステップＳ２０）。既に登録済みの場合は、最新のものに更新するが、通常は行毎に列数が変わるようなものではないので、ステップＳ２０の処理は最初の１回（１行目の処理の際）のみ行うようにしてもよい。
【００４２】
そして、ステップＳ１２に戻り、次の１行分のデータを取得して、上記と同様の処理を実行することを繰り返す。このように、ファイル最後尾に達するまで、インデックスリスト１３の生成を行う。すなわち、データファイル２０のデータ群の先頭のデータから最後のデータまで順次各データに対応するリスト要素３０を生成してその前後のリスト要素３０と連結していくことで、リスト要素３０群がシリアルに連結された構成のインデックスリスト１３を生成する。
【００４３】
図５に、上記インデックスリスト生成処理によるインデックスリスト生成の具体例を示す。
図５の例では、図５（ａ）に示すように、データファイル２０には４行４列のデータが格納されているもの。
【００４４】
このデータファイル２０に対して上記図４のインデックスリスト生成処理を実行すると、図５（ｂ）に示すように、１６個のリスト要素３０が、１行１列目のデータに対応するものから４行４列目のデータに対応するものまで順次シリアルに連結されたインデックスリスト１３が生成され、最大列番号＝‘４’が登録される。
【００４５】
上記処理の結果、データファイル２０に応じたインデックスリスト１３を生成でき、このインデックスリスト１３を用いてデータファイル２０上の任意のデータにアクセス（参照、更新等）できる。
【００４６】
尚、図示のインデックスリスト１３における各リスト要素３０の矩形内に示す“red”、“blue”等は、各リスト要素３０に対応するデータを意味するが、ここでは説明を分かり易くする為に示している。すなわち、ここでの説明では用いないが、例えば後述する図８等の説明の際に、特定のリスト要素３０を示す際に“red”、“blue”等と記す場合がある。但し、同じデータもあるので、例えば図示の例において１行２列のリスト要素３０は「１行目の“blue”」、３行４列のリスト要素３０は「３行目の“blue”」等と区別して記す場合もある。
【００４７】
図６は、データファイル−インデックスリスト変換処理部１１による上記データファイル保存処理の処理フローチャート図である。この処理は、詳しくは後に説明するが、主に、後述する追加、挿入、削除処理等によってインデックスリスト１３が更新された後に、この更新後のインデックスリスト１３に対応する内容へとデータファイル２０の内容を更新する為の処理である。
【００４８】
図６の処理では、まず、保存先のデータファイル２０をオープンする（ステップＳ３１）。
そして、例えばインデックスリスト１３の先頭のリスト要素３０から順番に各リスト要素３０を取得して、取得したリスト要素３０を参照してステップＳ３２以降の処理を実行する。最初はインデックスリスト１３の先頭のリスト要素３０を取得して、これを参照することになる。
【００４９】
まず、リスト要素３０のデータポインタ３１が示すデータを上記保存先のデータファイル２０に格納する（ステップＳ３２）。ステップＳ３２では、更に、新たなデータ格納位置を示すポインタにより、データポインタ３１を更新する。この処理については後に図１３に示す具体例を参照して説明する。
【００５０】
次に、このリスト要素３０の次リスト要素ポインタ３３がＥＯＦであるか否かを確認する（ステップＳ３３）。ＥＯＦであった場合には（ステップＳ３３，ＹＥＳ）、データファイル２０を保存してクローズする（ステップＳ３４）。
【００５１】
ＥＯＦでない場合（ステップＳ３３，ＮＯ）、すなわち、インデックスリスト１３に次のリスト要素３０がある場合には、現在参照しているリスト要素３０が、先頭から最大列番号の整数倍番目であるか否かを判定する（ステップＳ３５）。これは、換言すれば、現在参照しているリスト要素３０が、任意の行の最後のリスト要素３０であるか否かを判定するものであり、例えば図３の例では先頭から５番目、１０番目、１５番目等のリスト要素３０の場合に、ステップＳ３５の判定がＹＥＳとなる。
【００５２】
整数倍番目ではない場合（ステップＳ３５，ＮＯ）、上記ステップＳ３２で格納したデータの後にデータ区切り文字（カンマ等）を格納する（ステップＳ３６）。整数倍番目であった場合（ステップＳ３５，ＹＥＳ）、上記ステップＳ３２で格納したデータの後に改行コードを格納する（ステップＳ３７）。
【００５３】
そして、現在参照しているリスト要素３０の次リスト要素ポインタ３３を参照し、次リスト要素ポインタ３３が指し示すリスト要素３０を取得して（ステップＳ３８）、ステップＳ３２に戻り上記と同様の処理を実行する。
【００５４】
以降、インデックスリスト１３の最後尾のリスト要素３０に達するまでの間、データファイル２０へのデータ格納、及びデータ区切り文字又はデータファイルの改行コードの格納を繰り返し行う。
【００５５】
以上、データファイル−インデックスリスト変換処理部１１による処理例について説明した。
以下、インデックスリスト操作処理部１２による処理例について、図７等のフローチャート図等を参照して説明する。
【００５６】
インデックスリスト操作処理部１２は、追加処理、挿入処理、削除処理等を実行する。
追加処理は、データファイル２０に行単位あるいは列単位でデータを追加する為にインデックスリスト１３を更新する処理である。これは、複数行または複数列を一度に追加することが可能である。挿入処理は、データファイル２０の任意の行あるいは列の途中に、行単位あるいは列単位でデータを挿入する為に、インデックスリスト１３を更新する処理である。これも、上記追加処理と同様に、複数行または複数列を一度に挿入することが可能である。削除処理は、データファイル２０から任意の行あるいは列を削除する為に、インデックスリスト１３を更新する処理である。これも、複数行または複数列を一度に削除することが可能である。
【００５７】
ここで、以下の説明では、上記インデックスリスト１３を更新する為に、上記行単位のデータ（以下、行データという）に対応するリスト要素群が予め生成されているものとし、これは例えば後述する図１０（ｃ）に示すような行方向に連結されたリスト要素群のことであり、以下、これを行データのリスト要素群（行データの追加リスト要素群、行データの挿入リスト要素群等）と呼ぶ場合もある。同様に、上記列単位のデータ（以下、列データという）に対応するリスト要素群も予め生成されているものとし、これは例えば後述する図１０（ｂ）に示すような列方向に連結されたリスト要素群のことであり、以下、これを列データのリスト要素群（列データの追加リスト要素群、列データの挿入リスト要素群等）と呼ぶ場合もある。また、これら追加／挿入するリスト要素群の各リスト要素を、追加リスト要素／挿入リスト要素と呼ぶ場合もある。また、上記追加リスト要素群、挿入リスト要素群を、それぞれ、追加リスト、挿入リストと呼ぶ場合もある。
【００５８】
また、以下の説明では、インデックスリスト１３や追加リスト／挿入リストの各リスト要素がデータファイル２０のデータに対応するものであることを逐一述べない場合もある。例えば、各データは、例えばその行／列により例えば“ｍ行ｎ列目のデータ”、“ｍ行の最後／最初の（列の）データ”等と表記できるが、これら各データに対応するリスト要素に関して、逐一、“ｍ行ｎ列目のデータに対応するリスト要素”、“ｍ行の最後／最初の（列の）データに対応するリスト要素”等と表現せずに、例えば“ｍ行ｎ列のリスト要素”、“ｍ行の最後／最初の（列の）リスト要素”等と記す場合もあるものとする。
【００５９】
データファイル２０の内容を上記追加処理、挿入処理、削除処理等によって変更する為には、以下に説明するようにインデックスリスト１３の内容を変更する処理を実行する。以下、このような処理についてフローチャート図等を参照して説明する。
【００６０】
尚、本実施例では、更新前のインデックスリスト１３に対応するデータファイル２０は、Ｍ行Ｎ列のデータ群を格納しているものとして説明する。よって、最大列番号はＮとなっている。
【００６１】
図７は、追加処理の処理フローチャート図である。
ここでは、データファイル２０の既存のデータ群に対して、ｋ行の行データ又はｋ列の列データを追加するものとして説明する。
【００６２】
また、上記の通り、これら追加する行データ／列データに対応する追加リスト要素群が、予め生成されているものとする。この追加リストは、例えば後述する図８（ｂ）や図８（ｃ）に示すようなものである。この追加リストは、インデックスリスト１３と同様の形式により連結され且つ対応するデータへのデータポインタ３１が設定されているものである。すなわち、各リスト要素３０相互の連結関係（つまり、前リスト要素ポインタ３２と次リスト要素ポインタ３３）は予め設定されており、また、追加リストにおける各追加リスト要素３０のデータポインタ３１も予め設定されているものとする。
【００６３】
つまり、この時点で既に追加リスト要素群に対応するデータ群、すなわち上記追加する行データ／列データが、データファイル２０等に格納されている。これらのデータは、既存のインデックスリスト１３に対応するデータ群とは違う位置に格納されていてもよい。また、これら行データ／列データは、インデックスリスト１３に対応するデータファイル２０のデータ群と同様、ＣＳＶ形式で行・列を表す形で記述されている。そして、この様な追加データ群に対して例えば上記図５と略同様の処理を行うことで（但し、最大列番号の設定は行わない）、インデックスリスト１３と同様の構造の行データ／列データの追加リスト要素群が生成される。
【００６４】
また、例えばＭ行Ｎ列のデータ群に対して追加を行う場合には、上記ｋ行の行データは実質的にｋ行Ｎ列の行データとなり、上記ｋ列の列データは実質的にＭ行ｋ列の列データとなる。
【００６５】
尚、上述したことは、後述する挿入処理や実施例２における追加／挿入処理に関しても同様であり、以下、逐一説明しないものとする。
図７の処理では、まず、行データを追加するのか、列データを追加するのかを判定する（ステップＳ４１）。これは、例えば、図１に示すＣＳＶファイル利用処理群により行追加／列追加が指示され、更に何行／何列追加かが指示されるので、これに従って判定する。あるいは、ユーザ等が任意に行追加／列追加（その行数、列数）を指定するものであってもよい。
【００６６】
行データを追加する場合にはステップＳ４２〜Ｓ４５の処理を実行し、列を追加する場合にはステップＳ４６〜Ｓ５７の処理を実行する。
まず、行データを追加する場合の処理について説明する。この場合、上記ｋ行の行データに対応する追加リスト要素群を、そのまま、インデックスリスト１３の最後のリスト要素３０に連結するような形で追加すればよい。
【００６７】
つまり、まず、インデックスリスト１３の最後尾のリスト要素３０を取得する（ステップＳ４２）。次に、追加リスト要素群の先頭の追加リスト要素３０を取得する（ステップＳ４３）。
【００６８】
そして、上記ステップＳ４２で取得した“最後尾のリスト要素３０”の次リスト要素ポインタ３３に、上記ステップＳ４３で取得した“先頭の追加リスト要素３０”へのポインタを登録する（ステップＳ４４）。更に、上記“先頭の追加リスト要素３０”の前リスト要素ポインタ３２に、上記“最後尾のリスト要素３０”へのポインタを登録して（ステップＳ４５）、追加処理を終了する。
【００６９】
一方、列データを追加する場合には（上記の通り、ｋ列追加するものとする）、まず、行カウンタｊの値を１に初期化する（ｊ＝１）（ステップＳ４６）。
次に、インデックスリスト１３の“Ｎ＋（Ｎ＋ｋ）（ｊ−１）”番目のリスト要素３０を取得し（ステップＳ４７）、更にインデックスリスト１３の“Ｎ＋（Ｎ＋ｋ）（ｊ−１）＋１”番目のリスト要素３０を取得する（ステップＳ４８）。Ｎは上記の通り本例における最大列番号である。つまり、ステップＳ４７，Ｓ４８の処理は、任意の行（ｊ）の最後のリスト要素３０と、この行（ｊ）の次の行（ｊ＋1）の最初のリスト要素３０を取得する処理を意味する。
【００７０】
次に、列データの追加リストにおける“１”番目の追加リスト要素３０を取得し（ステップＳ４９）、更にこの追加リストにおける“ｋ”番目の追加リスト要素３０を取得する（ステップＳ５０）。尚、ｋ＝１の場合には、ステップＳ４９とＳ５０とで同じ追加リスト要素３０を取得することになるが、この場合はこの１つの追加リスト要素３０に対して後述するステップＳ５２〜Ｓ５５の処理を実行することになる。
【００７１】
上記ステップＳ４９，Ｓ５０の処理は、ｋ列より成る列データの各行毎にその行の最初と最後のデータに対応する追加リスト要素３０を取得する処理である。これについて、図８に一例を示して説明する。
【００７２】
図８は、行、列追加の具体例を示す図であり、上記図５の例のインデックスリスト１３に対応するデータ群に対して、まず２列の列データを追加し、次に１行の行データを追加する場合のインデックスリスト１３更新の例を示している。尚、２列の列データを追加することでデータ群は実質的に６列になるので、次に追加する１行の行データは６列分とする必要があり、これに応じて１行の行データの追加リストは６個のリスト要素３０より成るものとなる。
【００７３】
図８（ａ）に示すような、４行４列のデータ群に対応する（よって、最大列番号＝‘４’）インデックスリスト１３に対して、図８（ｂ）に示す４行２列の列データの追加リストを追加し、更に図８（ｃ）に示す１行６列の行データの追加リストを追加することで、図８（ｄ）に示すように、５行６列のデータ群に対応する（よって、最大列番号＝‘６’）インデックスリスト１３へと更新されることになる。
【００７４】
これによって、実質的に、データファイル２０の内容も更新されることになる。但し、この時点では、データファイル２０の内容は、図８（ｄ）に示すようなデータの並びになっていない。すなわち、この時点では、例えば１行目の“green”の次には改行記号を挟んで２行目の“yellow”が記述されている状態であり、これらの間に“silver2”と“silver3”が記述されているわけではない。追加リストに対応する各データは、別途、任意の記憶領域に記憶されている。但し、本方式では、図８（ｄ）に示す連結関係に基づいて（１）式により求めたリスト要素３０によりデータアクセスを行うので、問題なくデータアクセスを行うことができる。例えば、１行６列のデータが指定された場合には、問題なく、“silver3”にアクセスされることになる。よって、上記のようにインデックスリスト１３を更新することで実質的にデータファイル２０の内容も更新されると考えてよい。
【００７５】
尚、データファイル２０の内容が、図８（ｄ）に示すようなデータの並びになるように、データファイル２０を更新する為には、上記図６の処理を行えばよい。
図８（ｂ）、（ｃ）に示すように、追加リストは、インデックスリスト１３と同様の構造となっている。すなわち、図８（ｂ）に示すように、２列分の追加リストは、この例では４行２列のデータ群に対応するインデックスリスト１３と同様になっており、まず、１行目の各列の追加リスト要素“silver2”、“silver3”が連結され、１行目の最後の追加リスト要素“silver3”は２行目の最初の追加リスト要素“brown2”に連結され、以下同様にして図示の通り連結されている。つまり、追加リストの先頭の“silver2”から最後の“black3”まで、各追加リスト要素が順次シリアルに連結されている。
【００７６】
尚、当然、例えば“silver3”に関しては、その前リスト要素ポインタ３２は“silver2”へのポインタとなっており、その次リスト要素ポインタ３３は“brown2”へのポインタとなっている。
【００７７】
尚、各追加リスト要素の連結関係すなわち各ポインタ３２，３３は、後述するステップＳ５２〜Ｓ５５の処理によって変更される場合がある。
また、尚、図８（ｃ）に示す行データの追加リストも、上記列データの場合と同様、その各追加リスト要素はインデックスリスト１３と同様の形式で相互に連結されている。図８（ｃ）には１行の場合を例にしているが、例えば追加する行は２行であり、この２行目における先頭列のデータが仮に“red2”であるとした場合、図８（ｃ）に示す１行目における最後の追加リスト要素“gold2”とこの“red2”とが連結されていることになる。
【００７８】
また、尚、上記列データ、行データの追加リストは何れも、それらの各追加リスト要素のデータポインタ３１は既に設定されている。例えば、図８（ｂ）の例では、図示の４行２列の各データ（“silver2”〜“black3”までの８つのデータ）は既にデータファイル２０等に追加格納されており、各データの格納位置を示すポインタがそのデータに対応する追加リスト要素のデータポインタ３１は設定されている。
【００７９】
尚、既に述べたように、この時点では、これら各追加データは図８（ａ）に示すインデックスリスト１３に対応する既存の４行４列のデータ群に追加された状態にはなっておらず、別に記憶されている。後に図１３で説明するように、インデックスリスト１３を図８（ｄ）に示す状態へと更新後に図６の処理を行うことで、２列追加された５行６列のデータ群へと更新されることになる。
【００８０】
ここで、上記ステップＳ４９，Ｓ５０の処理は、２列追加（ｋ＝２）の場合には追加リスト要素群における１番目と２番目の追加リスト要素３０が取得されることになるので、上記図８の例では、最初は１行目の“silver2”と“silver3”が取得されることになる。同様に、ｊ＝２のときには、２行目の“brown2”と“brown3”が取得されることになる。ここでは、２列分の追加を例にするが、例えば３列の場合であって１行目に更に不図示の“silver4”があるとした場合、１行目に関しては“silver2”と“silver4”が取得されることになる。つまり、各行毎に、その行の最初と最後のリスト要素３０が取得されることになる。
【００８１】
ステップＳ４６〜Ｓ５６の処理は、概略的には、追加リストの各行毎に、その行の全てのリスト要素３０を、インデックスリスト１３における同じ行の最後に追加する処理となる（より詳しくは、インデックスリスト１３における同じ行の最後のリスト要素とその次の行の先頭のリスト要素との間に、上記１行分の全追加リスト要素を挿入する形となる）。
【００８２】
上記ステップＳ５０の処理に続いて、ステップＳ４７，Ｓ４８の両方でリスト要素３０が取得できたか否かを判定する（ステップＳ５１）。Ｓ４７，Ｓ４８の両方ともリスト要素３０が取得できなかった場合、あるいはいずれか一方のリスト要素３０が取得できなかった場合（ステップＳ５１，ＮＯ）、インデックスリスト１３において追加先がないことを意味するので、本処理を終了する。但し、終了前に、最大列番号Ｎを更新する（ステップＳ５７）。これは、現在の最大列番号Ｎに追加した列数ｋを加算した値に更新するものである（Ｎ＝Ｎ＋ｋ）。そして、追加処理を終了する。
【００８３】
一方、Ｓ４７，Ｓ４８の両方でリスト要素３０が取得できた場合（ステップＳ５１，ＹＥＳ）、ｊを＋１インクリメント（ステップＳ５６）しながらステップＳ５２〜５５の処理を行うことで、追加リストにおける各行毎に、その行の全ての追加リスト要素を、インデックスリスト１３の対応する行の最後に追加することになる。例えば、最初は（ｊ＝１）は、追加リストにおける１行目の全追加リスト要素を、インデックスリスト１３における1行目の最後に追加することになる。そして、ｊを＋１インクリメントして（ステップＳ５６）ステップＳ４７に戻り、次の１行分の１又は複数の追加リスト要素を、インデックスリスト１３の対応する行に追加する為の処理を開始することになる。
【００８４】
ステップＳ５２〜５５の処理では、まず、ステップＳ４７で取得したリスト要素３０の次リスト要素ポインタ３３に、ステップＳ４９で取得した追加リスト要素３０へのポインタを登録する(ステップＳ５２)。続いて、ステップＳ４９で取得した追加リスト要素３０の前リスト要素ポインタ３２に、ステップＳ４７で取得したリスト要素３０へのポインタを登録する（ステップＳ５３）。
【００８５】
次に、ステップＳ４８で取得したリスト要素３０の前リスト要素ポインタ３２に、ステップＳ５０で取得した追加リスト要素３０へのポインタを登録する（ステップＳ５４）。続いて、ステップＳ５０で取得した追加リスト要素３０の次リスト要素ポインタ３３に、ステップＳ４８で取得したリスト要素３０へのポインタを登録する（ステップＳ５５）。
【００８６】
そして、上記の通り、行カウンタｊの値を＋１インクリメントして（ステップＳ５６）、ステップＳ４７の処理に戻り、ステップＳ５１の判定がＮＯになるまで、ステップＳ４７〜Ｓ５６の処理を繰り返し実行する。
【００８７】
尚、１列追加する場合には、上記の通りステップＳ７３，Ｓ７４により１つの追加リスト要素３０のみが取得されることになるので、ステップＳ７６、Ｓ７８の処理は、この１つの追加リスト要素３０のポインタを登録する処理となり、ステップＳ７７，Ｓ７９の処理は、この１つの追加リスト要素３０における前リスト要素ポインタ３２、次リスト要素ポインタ３３に登録を行うことになる。
【００８８】
ここで、図８の例において、ｊ＝２のときのステップＳ４７〜Ｓ５０の処理について説明することで、これらの処理の意味について説明しておく。図８（ｂ）の例では、２列追加するのでｋ＝２となる。よって、ステップＳ４７，Ｓ４８では、“Ｎ＋（Ｎ＋ｋ）（ｊ−１）”＝１０番目、“Ｎ＋（Ｎ＋ｋ）（ｊ−１）＋１”＝１１番目のリスト要素３０を取得することになる。
【００８９】
ここで、図８の例においては、ステップＳ４７、Ｓ４８の処理は、図８（ａ）のインデックスリスト１３に４行２列の列データを各行ｊ単位で追加する際の各行の挿入箇所の前後のリスト要素３０を取得する処理であり、上記の通り、ｊ行の最後とｊ＋１行の最初のリスト要素３０をそれぞれ取得することになる。これより、最初（ｊ＝１）は図８（ａ）に示す４番目（１行４列）の“green”と５番目（２行１列）の“yellow”の各リスト要素３０が取得されることになる。次のｊ＝２のときには、図８（ａ）に示す８番目（２行４列）の“brown”と９番目（３行１列）の“white”の各リスト要素３０を取得する必要がある。つまり、更新前のインデックスリスト１３における最大列番号Ｎの整数倍の番号のリスト要素３０とその次のリスト要素３０とを取得する必要がある。
【００９０】
しかしながら、上記ｊ＝１のときのステップＳ５２〜Ｓ５５の処理により、インデックスリスト１３は更新され、“silver2”と“silver3”とが追加された状態となっている。つまり、１行目のみに関しては、図８（ｄ）に示す状態となっている。この為、上記８番目と９番目の各リスト要素“brown”、“white”は、それぞれ、１０番目と１１番目になっている（２行目以降は未だ追加されていないので、未だ“white”は“brown”の次となっている）。これに対して、ステップＳ４７，Ｓ４８の処理によれば上記のように１０番目と１１番目のリスト要素３０が取得されるので、間違いなく、“brown”と“white”が取得され、これらの間に追加列データの２行目に対応する追加リスト要素“brown2”、“brown3”が追加（挿入）されることになる。
【００９１】
一方で、上記のように例えばｊ＝１のときの処理によりインデックスリスト１３に“silver2”と“silver3”とが追加されることは、追加リスト要素群から“silver2”と“silver3”とが削除される（リンクが切れる）ことを意味することになる。よって、例えばｊ＝２のときには追加リスト要素群は１番目が“brown2”、２番目が“brown3”となっているので、上記ステップＳ４９，Ｓ５０の処理により、“brown2”と“brown3”が取得されることになる。
【００９２】
尚、上記図８の例では、行データと列データの両方の追加を行っているが、勿論、何れか一方の追加のみでも構わない。
上記図８の例では、図８（ａ）に示す４行４列のデータ群に対応するインデックスリスト１３に対して、まず図８（ｂ）に示す２列の列データの追加リストを追加し、更に図８（ｃ）に示す１行の行データの追加リストを追加することで、図８（ｄ）に示す５行６列のデータ群に対応するインデックスリスト１３へと更新されることになる。
【００９３】
次に、以下、インデックスリスト操作処理部１２による挿入処理について説明する。
図９は、挿入処理の処理フローチャート図である。
尚、ここでは、最大列番号Ｎのインデックスリスト１３に対して、そのｎ行目にｋ行の行データを挿入、又はそのｎ列目にｋ列の列データを挿入するものとして説明する。
【００９４】
また、挿入処理に係る一例を図１０に示す。以下の図９の説明は、図１０の例も参照して説明する場合もある。
図９の処理では、まず、上記と同様に、行データを挿入するのか、列データを挿入するのかを判定する（ステップＳ６１）。
【００９５】
行データを挿入する場合にはステップＳ６２〜Ｓ６９の処理を実行し、列データを挿入する場合にはステップＳ７０〜Ｓ８１の処理を実行する。
まず、行データを挿入する場合の処理について説明する。これは、上記行データの追加の場合の処理と基本は一緒であるが、追加の場合は上記ｋ行の行データを単純にインデックスリスト１３の最後に追加すれば済んだが、挿入の場合はまず挿入箇所の前後のリスト要素３０を取得する必要がある。
【００９６】
すなわち、ここでは上記の通り、インデックスリスト１３のｎ行目にｋ行の行データを挿入するものであり、これは、インデックスリスト１３のｎ−１行目とｎ行目の間に行データを挿入することを意味するものとする。ｋ＝１の場合には、挿入後は挿入した行データが新たなｎ行目のデータとなる。
【００９７】
これより、まず、インデックスリスト１３の“（ｎ−１）×Ｎ”番目のリスト要素３０を取得し（ステップＳ６２）、更にインデックスリスト１３の“（ｎ−１）×Ｎ＋１”番目のリスト要素３０を取得する（ステップＳ６３）。つまり、インデックスリスト１３のｎ−１行目の最後とｎ行目の最初のリスト要素３０を取得する。この２つのリスト要素３０の間に、上記行データを挿入することになる。
【００９８】
これより、まず、挿入する行データの挿入リストの先頭の挿入リスト要素３０を取得し（ステップＳ６４）、更に、上記挿入リストの最後尾の挿入リスト要素３０も取得する（ステップＳ６５）。
【００９９】
そして、ステップＳ６２とＳ６４で取得したリスト要素３０同士を連結する処理、ステップＳ６３とＳ６５で取得したリスト要素３０同士を連結する処理を行う。これによって、インデックスリスト１３のｎ−１行目とｎ行目の間にｋ行の行データの挿入リストが挿入されることになる。
【０１００】
この連結処理がステップＳ６６〜Ｓ６９の処理であり、まず、ステップＳ６２で取得したリスト要素３０の次リスト要素ポインタ３３に、ステップＳ６４で取得した挿入リスト要素３０へのポインタを登録する（ステップＳ６６）。続いて、ステップＳ６４で取得した挿入リスト要素３０の前リスト要素ポインタ３２に、ステップＳ６２で取得したリスト要素３０へのポインタを登録する（ステップＳ６７）。
【０１０１】
同様にして、ステップＳ６３で取得したリスト要素３０の前リスト要素ポインタ３２に、ステップＳ６５で取得した挿入リスト要素３０へのポインタを登録する（ステップＳ６８）。続いて、ステップＳ６５で取得した挿入リスト要素３０の次リスト要素ポインタ３３に、ステップＳ６３で取得したリスト要素３０へのポインタを登録する（ステップＳ６９）。以上で、行データの挿入処理を終了する。
【０１０２】
次に、列データを挿入する場合の処理について説明する。これについても、上記列データの追加の場合の処理と基本は一緒であるが、一部が異なるものとなる。すなわち、ステップＳ７１，Ｓ７２の処理は、図７のステップＳ４７，Ｓ４８の処理と異なるが、それ以外の処理は図７とほぼ同様と考えてよい。ステップＳ７１，Ｓ７２の処理が異なるのは、図７の追加処理ではインデックスリスト１３の最後の列（Ｎ列目）のリスト要素３０の後に列データの追加リスト要素を連結するものであったのに対して、挿入処理の場合には任意のｎ列目に列データの追加リスト要素を挿入するものであるので、これに応じた処理を行うからである。尚、上記行データの場合と同様、“ｎ列目に挿入する”とは、ｎ−１列目とｎ列目の間に挿入することを意味し、ｋ＝１の場合にはこの列データが新たなｎ列目のデータとなることになる。
【０１０３】
上述したことより、ステップＳ７０〜Ｓ８１の列データ挿入処理について、以下、簡単に説明する。
まず、行カウンタｊの値を‘１’に初期化する（ステップＳ７０）。
【０１０４】
次に、インデックスリスト１３の“ｎ＋（Ｎ＋ｋ）（ｊ−１）−１”番目のリスト要素３０を取得し（ステップＳ７１）、更にインデックスリスト１３の“ｎ＋（Ｎ＋ｋ）（ｊ−１）”番目のリスト要素３０を取得する（ステップＳ７２）。
【０１０５】
上記ステップＳ７１、Ｓ７２の処理について、図１０の例を用いて説明する。図１０の例では、図１０（ａ）のインデックスリスト１３、すなわち図５に示した４行４列のインデックスリスト１３（よって、Ｎ＝４となる）に対して、まず図１０（ｂ）に示す１列の列データを、インデックスリスト１３の“４列目に挿入”し、次に、図１０（ｃ）に示す１行の行データを、インデックスリスト１３の“４行目に挿入”することで、挿入処理後のインデックスリスト１３は図１０（ｄ）に示す状態となる。
【０１０６】
図１０の例では、列データ挿入に関して、ｎ＝４、ｋ＝１となる。よって、最初（ｊ＝１）はステップＳ７１で３番目（white）、Ｓ７２で４番目（green）のリスト要素３０が取得され、ループして次の処理（ｊ＝２）においては８番目（silver）と９番目（brown）が取得されることになる。既に追加処理の際に説明してある通り、更新前（図１０（ａ））の状態では“silver”は７番目、“brown”は８番目であるが、ｊ＝１の場合の処理により１行目に“silver2”が挿入されている為、“silver”は８番目、“brown”は９番目となっており、上記ステップＳ７１，Ｓ７２の処理により、順番が変わっていてもこれら目的のリスト要素３０を取得することができる。ｊ＝３以降の処理についても同様である。
【０１０７】
次に、ステップＳ７３、Ｓ７４の処理を実行するが、これは上記ステップＳ４９，Ｓ５０の処理と同じであり、ここでは特に説明しないが、図１０の例では図１０（ｂ）に示すように、挿入する列データは１列（ｋ＝１）であるので、ステップＳ７３とＳ７４は同じリスト要素３０（ｊ＝１のときは“silver2”、ｊ＝２のときには“brown2”等）を取得することになる。取得するリスト要素３０が１つの場合に関しては、既に説明した通りである。
【０１０８】
次に、ステップＳ７１、Ｓ７２の両方で取得成功したか否かを判定する（ステップＳ７５）。これは、上記ステップＳ５１と同様の処理であり、特に説明しない。両方取得できなかった場合には（ステップＳ７５，ＮＯ）、インデックスリスト１３において挿入先がないことを意味するので、上記ステップＳ５７と同様に最大列番号Ｎを更新して（Ｎ＝Ｎ＋ｋ）（ステップＳ８１）、列データ挿入処理を終了する。
【０１０９】
両方取得できた場合には（ステップＳ７５，ＹＥＳ）、上記ステップＳ５２〜Ｓ５５と略同様の処理であるステップＳ７６〜Ｓ７９の処理を実行することで、挿入する列データの１行分の１又は複数の挿入リスト要素（図１０のように１列の場合は１つの挿入リスト要素）を、上記ステップＳ９１で取得したリスト要素３０とステップＳ９２で取得したリスト要素３０との間に挿入することになる。そして、行カウンタｊの値を＋１インクリメントして（ステップＳ８０）、ステップＳ７１の処理に戻り、ステップＳ７５の判定がＮＯになるまで、ステップＳ７１〜Ｓ８０の処理を繰り返し実行する。
【０１１０】
ステップＳ７６〜Ｓ７９の処理に関しては、まず、ステップＳ７１で取得したリスト要素３０の次リスト要素ポインタ３３に、ステップＳ７３で取得した挿入リスト要素３０へのポインタを登録する（ステップＳ７６）。続いて、ステップＳ７３で取得した挿入リスト要素３０の前リスト要素ポインタ３２に、ステップＳ７１で取得したリスト要素３０へのポインタを登録する（ステップＳ７７）。
【０１１１】
同様にして、ステップＳ７２で取得したリスト要素３０の前リスト要素ポインタ３２に、ステップＳ７４で取得した挿入リスト要素３０へのポインタを登録する（ステップＳ７８）。続いて、ステップＳ７４で取得した挿入リスト要素３０の次リスト要素ポインタ３３に、ステップＳ７２で取得したリスト要素３０へのポインタを登録する（ステップＳ７９）。
【０１１２】
そして、上記の通り、ステップＳ８０の処理を行ってステップＳ７１に戻る。
尚、図１０（ｃ）に示す行データ挿入処理に関しては、ここでは４行目に挿入するものとし（ｎ＝４）、これよりステップＳ６２、Ｓ６３の処理では、図１０（ａ）に示すインデックスリスト１３における１２番目（３行４列の“blue”）と１３番目（４行１列の“silver”）とが取得されることになる。また、ステップＳ６４，Ｓ６５の処理では、図１０（ｃ）に示す“silver1”と“gold1”が取得されることになる。これより、ステップＳ６６〜Ｓ６９の処理を実行することで、“blue”と“silver1”とが連結され、“gold1”と“silver”とが連結されることで、“blue”と“silver”との間に、図１０（ｃ）に示す１行分の挿入リスト要素３０が挿入されることになる。これより、図１０（ｄ）に示すように、図１０（ｃ）に示す行データの挿入リストが新たな４行目となったインデックスリスト１３が生成されることになる。
【０１１３】
上記のように、図１０（ｂ）の列データと図１０（ｃ）の行データが挿入されることで、図１０（ａ）に示す４行４列のインデックスリスト１３が、図１０（ｄ）に示す５行５列のインデックスリスト１３へと更新されることになる（当然、最大列番号Ｎは４から５に更新される）。
【０１１４】
次に、以下、インデックスリスト操作処理部１２による削除処理について説明する。
図１１は、削除処理の処理フローチャート図である。また、図１２に、削除処理に係る具体例を示す。以下、場合によっては図１２を参照しながら、図１１の処理について説明する。
【０１１５】
ここでは、ｎ行目からｋ行を削除、又はｎ列目からｋ列を削除するものとして説明する。
まず、行を削除するのか、列を削除するのかを判定する（ステップＳ９１）。
【０１１６】
行を削除する場合にはステップＳ９２〜Ｓ９５の処理を実行する。列を削除する場合にはステップＳ９６〜Ｓ１０３の処理を実行する。
まず、行を削除する場合について説明する。
【０１１７】
この場合、まず、インデックスリスト１３の“（ｎ−１）×Ｎ”番目のリスト要素３０を取得し（ステップＳ９２）、更にインデックスリスト１３の“（ｎ＋ｋ−１）×Ｎ＋１”番目のリスト要素３０を取得する（ステップＳ９３）。
【０１１８】
すなわち、削除すべきｋ行分のデータ（リスト要素群）の１つ前の（直前の）行の最後のリスト要素３０と１つ後の（直後の）行の先頭のリスト要素３０とを取得する。ここで、図１２の例において、図１２（ａ）に示す５行５列のインデックスリスト１３に対して、その３行目から１行（ｋ＝１）すなわち３行目のみを削除するとした場合、ｎ＝３、Ｎ＝５であるので、ステップＳ９２では１０番目すなわち図示の２行５列の“brown”が取得され、ステップＳ９３では１６番目すなわち図示の４行１列の“silver1”が取得されることになる。そして、これらを連結する処理を行う。
【０１１９】
すなわち、ステップＳ９２で取得したリスト要素３０の次リスト要素ポインタ３３に、ステップＳ９３で取得したリスト要素３０へのポインタを登録する（ステップＳ９４）。続いて、ステップＳ９３で取得したリスト要素３０の前リスト要素ポインタ３２に、ステップＳ９２で取得したリスト要素３０へのポインタを登録する（ステップＳ９５）。これにより、ステップＳ９２，Ｓ９３で取得した２つのリスト要素３０同士が連結されると共に、これら２つのリスト要素３０の間にあったリスト要素群の先頭と末尾のリスト要素３０との連結が解除されることになり、これをもって当該削除対象のリスト要素群はインデックスリスト１３から削除されることになる。よって、以上で行削除処理は終了する。
【０１２０】
尚、図１２（ａ）の例では、１０番目の“brown”と１６番目の“silver1”とが連結されることになり、これらの間にあったリスト要素群すなわち３行目のデータは、図１２（ａ）のインデックスリスト１３との連結を解除された（削除された）ものとなる。
【０１２１】
次に、列を削除する場合について説明する。
この場合はまず、行カウンタｊの値を１に初期化する（ステップＳ９６）。
次に、インデックスリスト１３の“（ｎ−１）＋（Ｎ−ｋ）（ｊ−１）”番目のリスト要素３０を取得し（ステップＳ９７）、更にインデックスリスト１３の“ｎ＋（Ｎ−ｋ）（ｊ−１）＋ｋ”番目のリスト要素３０を取得する（ステップＳ９８）。
【０１２２】
すなわち、ｊ＝１，２，３、・・・とｊの値すなわち処理対象の行を設定する毎に、この処理対象の行における削除対象の列のリスト要素３０（ｋ＝２以上では複数のリスト要素３０）の直前と直後のリスト要素３０を取得する。
【０１２３】
図１２の例は、図１２（ａ）に示すインデックスリスト１３から３列目と４列目の２つの列を削除するものであり、この例では、Ｎ＝５、ｎ＝３、ｋ＝２となるので、上記ステップＳ９７，Ｓ９８の処理により、例えばｊ＝１の場合は、２番目（１行２列の“blue”）と５番目（１行５列の“green”）が取得されることになる。次のｊ＝２のときの処理では、図１２（ａ）に示す７番目（２行２列の“black”）と１０番目（２行５列の“brown”）が取得すべきリスト要素３０であるが、このときのインデックスリスト１３は上記１行目の２つのリスト要素３０が削除された状態であるので、“black”は５番目、“brown”は８番目となっている。上記ステップＳ９７，Ｓ９８の処理は、これに対処するものであり、Ｎ＝５、ｎ＝３、ｋ＝２、ｊ＝２の場合、ステップＳ９７では５番目、ステップＳ９８では８番目のリスト要素３０を取得することになるので、問題なくこれら目的の“black”と“brown”を取得することができる。
【０１２４】
次に、ステップＳ９７，Ｓ９８の両方でリスト要素３０が取得できたか否かを判定する（ステップＳ９９）。両方のリスト要素３０が取得できなかった、あるいはいずれか一方のリスト要素３０が取得できなかった場合（ステップＳ９９，ＮＯ）、インデックスリスト１３中に削除対象となるリスト要素３０がないことを意味するので、最大列番号Ｎを更新して（ステップＳ１０３）、列削除処理を終了する。ステップＳ９３の処理は、最大列番号Ｎを現在の最大列番号Ｎから削除した列数ｋを減算した値に更新する（Ｎ＝Ｎ−ｋ）処理である。
【０１２５】
一方、両方のリスト要素が取得できた場合（ステップＳ９９，ＹＥＳ）、ステップＳ９７，Ｓ９８で取得した２つのリスト要素３０同士を連結する処理を行うことで、この２つのリスト要素３０間にある１または複数のリスト要素３０をインデックスリスト１３から除外（削除）する。すなわち、ステップＳ９７で取得したリスト要素３０の次リスト要素ポインタ３３に、ステップＳ９８で取得したリスト要素３０へのポインタを登録する（ステップＳ１００）。続いて、ステップＳ９８で取得したリスト要素３０の前リスト要素ポインタ３２に、ステップＳ９７で取得したリスト要素３０へのポインタを登録する（ステップＳ１０１）。
【０１２６】
そして、行カウンタｊの値を＋１インクリメントして、ステップＳ９７に戻り、次の行に関しても同様の処理を実行する。
図１２に示す例では、上記図１１の処理により、図１２（ａ）に示すインデックスリスト１３から、３〜４列目の列データを削除し、続けて、４行目の行データを削除している。これにより、インデックスリスト１３は図１２（ｂ）に示す状態へ更新される。すなわち、まず、３〜４列目を指定して列削除処理を実行すると、インデックスリスト１３から、３〜４列目の列データに対応するリスト要素群が削除され、最大列番号が５から３に更新される。次に、４行目を指定して行削除処理を実行すると、上記更新後のインデックスリスト１３から更に４行目の行データに対応するリスト要素群が削除され、その結果、図１２（ｂ）に示すように、４行３列のデータ群に対応するインデックスリスト１３に更新される。
【０１２７】
図１３に、上記図１２（ｂ）に示す状態へと更新された、４行３列のデータを表すインデックスリスト１３に基づいて、上記図６に示すデータファイル保存処理を実行した場合を示す。
【０１２８】
すなわち、ここでは、上記削除処理によって更新されたインデックスリスト１３に基づいて、データファイル２０を更新すると共に、インデックスリスト１３の内容も更に更新する。
【０１２９】
図１３（ａ）に示すインデックスリスト１３は、図１２（ｂ）に示すものと同じである。つまり、上記削除処理により、５行５列のデータに対応するものが４行３列のデータに対応するものとなっている。但し、この時点では、既に述べたように、データファイル２０のデータは未だ５行５列のままである。そして、図１３（ａ）に示すインデックスリスト１３の各リスト要素３０のデータポインタ３１も、５行５列のデータ群の対応データのポインタとなっている。
【０１３０】
これより、図１３（ａ）に示すインデックスリスト１３に対して、図６のデータファイル保存処理を実行することで、図１３（ｂ）に示すような４行３列のデータファイル２０が生成されると共に、特に図示していないが、インデックスリスト１３の各リスト要素３０のデータポインタ３１も、この４行３列のデータファイル２０における対応データのポインタへと更新されている。
【０１３１】
すなわち、上述した図６の処理では、まず、ステップＳ３１で上記４行３列のデータ群を格納すべき新規のデータファイル２０をオープンする。この時点では、このデータファイル２０には何もデータは格納されていない。そして、各リスト要素３０毎に、上記ステップＳ３２の処理により、このリスト要素３０のデータポインタ３１が示すデータ（５行５列のデータ群の対応データ）を取得して、これを上記新規データファイル２０にコピーする。そして、コピー先を示すポインタを新たなデータポインタとしてデータポインタ３１を更新する。尚、データファイル保存処理終了後、上記５行５列のデータファイル２０は削除する。
【０１３２】
尚、ここでは、削除処理後にデータファイル保存処理を実行した例を示すが、これに限らず、上記追加処理や挿入処理の実行後にも、同様にしてデータファイル保存処理を実行することで、これら追加処理や挿入処理による更新後のインデックスリスト１３の内容に応じた新たなデータファイル２０を生成する。
【０１３３】
このように、インデックスリスト１３に対して行った、データの追加、挿入、削除等の操作の結果を、データファイル２０に反映させることができる。
上記の通り、追加／更新／削除処理によりインデックスリスト１３を更新することで、データファイル２０も実質的に更新されたものとなり、更新後のインデックスリスト１３を用いて問題なく所望のデータにアクセスできる。勿論、追加等したデータにもアクセスでき、あるいは削除したデータにはアクセスできない。但し、例えば、削除処理によって削除したデータは、実際には未だデータファイル２０内に残っており、インデックスリスト１３上では削除されたものとして管理されている。これは、追加／更新処理に関しても略同様である。
【０１３４】
これに対して、上記図６の処理を行うことで、例えば、削除処理に関しては、上記削除処理によるインデックスリスト更新によって実質的に削除されたものとなっていたデータが、データファイル保存処理によって生成されたデータファイル２０においては削除されていることになる。追加処理、挿入処理に関しても略同様であり、更新後のインデックスリスト１３の内容に応じたデータファイル２０が生成されることになる。
【０１３５】
以上説明したように、実施例１によれば、データファイルの構造を解析し、内容を要約してデータファイル上のデータと関連付けたインデックスリストを生成し、生成したインデックスリストに対して操作を行うことによって、データファイル上の個々のデータに対して参照・編集等ができ、さらにデータファイルに対して行・列単位でのデータの追加・挿入・削除といった操作が可能となる。
【０１３６】
次に、以下、実施例２について説明する。
図１４は、実施例２のデータファイル操作システムの構成図である。
図示のデータファイル操作システムは、データファイル操作部５０とデータファイル６０から成る。データファイル６０はデータベース装置（記憶装置）に記憶されている。データファイル操作部５０は、各種ＣＳＶファイル利用処理群からの要求に応じて、データファイル６０の操作（データ参照／更新等、あるいは行単位／列単位でのデータ追加、挿入、削除等）と、これに伴うインデックスリスト５３の操作を行う。
【０１３７】
データファイル操作部５０は、データファイル−インデックスリスト変換処理部５１と、インデックスリスト操作処理部５２を有する。また、インデックスリスト５３を記憶している。
【０１３８】
インデックスリスト５３は、図１５に示すようなリスト要素７０で構成される。リスト要素７０は、データファイル６０上の一つのデータへのポインタ７１（以降、データポインタ７１と記載）と、インデックスリスト５３における自要素の一つ前の行のリスト要素３０へのポインタ７２（以降、前行リストポインタ７２と記載）と、インデックスリスト５３における自要素の一つ次の行のリスト要素へのポインタ７３（以降、次行リストポインタ７３と記載）と、インデックスリスト５３における自要素の一つ前の列のリスト要素へのポインタ７４（以降、前列リストポインタ７４と記載）と、インデックスリスト５３における自要素の一つ次の列のリスト要素へのポインタ７５（以降、次列リストポインタ７５と記載）とで構成されている。この他にも、リスト要素として必要な情報があれば、追加しても構わない。
【０１３９】
尚、必ずしも上記４つのリストポインタ７２〜７５全てが登録されるものではないが、何れか１つ以上は登録される。詳しくは後述する。
データポインタ７１は、データファイル６０上の一つのデータへのポインタを示すが、もし、データが空欄であれば、空欄であることを示す識別データを格納する。識別データは、データが空欄であることを判別できればどのようなものでも構わない。本実施例では、データが空欄であることを示す識別データとして”NULL”を格納するものとする。
【０１４０】
インデックスリスト５３は、例えば一例としては図１６に示すような構造である。図３と同様、図示の各矩形が各リスト要素７０を意味する。また、図示の（１，２）や矢印等は図３で説明したものと略同様である。但し、矢印は、図示の列方向の矢印は上記次行リストポインタ７３による連結を意味し、行方向の矢印は上記次列リストポインタ７５による連結を意味する。図示の通り、何れも、自要素と同じ行又は同じ列の前後のリスト要素３０に対する連結となっている。
【０１４１】
データファイル６０に記述されているデータ1件に対して、１つのリスト要素７０が割り当てられている。
１列目のリスト要素７０同士は前行リストポインタ７２と次行リストポインタ７３によって連結している。図１６に示すように、１行１列目のデータに該当するリスト要素をrootリスト要素と呼ぶものとする。データ参照、更新等を行う際には、このrootリスト要素を起点として、上記リストポインタにより連結先を辿っていくことで、該当するリスト要素７０を見つけることになる。詳しくは後述する。
【０１４２】
また、図示のように、１列目の各リスト要素７０すなわち上記の通り前行リストポインタ７２、次行リストポインタ７３によって連結しているリスト要素７０を、先頭列リスト要素と呼ぶものとする。先頭列リスト要素の最後の行に該当するリスト要素７０は、次行リストポインタ７３に、行及びファイルの終端であることを意味する識別子“EOF”が登録される。
【０１４３】
各先頭列リスト要素からは、前列リストポインタ７４、次列リストポインタ７５によって行方向にリスト要素７０が連結している。例えば、２行１列の先頭リスト要素からは、２行２列、２行３列・・・というように、この先頭リスト要素と同じ行すなわち２行目における各リスト要素７０が連結している。最後の列（ここでは５列目）のリスト要素７０には、その次列リストポインタ７５に、このリスト要素７０がその行の最後であることを意味する識別子“EOL”が登録される。
【０１４４】
上記リスト要素７０同士の連結は、行方向／列方向に区別されている点を除けば、実施例１におけるリスト要素３０同士の連結とほぼ同様と考えてよい。行方向の連結は、前列リストポインタ７４と次列リストポインタ７５とによって行われる。列方向の連結は、前行リストポインタ７２と次行リストポインタ７３とによって行われる。但し、本例では上記の通り、列方向の連結は、先頭列リスト要素のみである。よって、先頭列リスト要素以外のリスト要素７０においては、その前行リストポインタ７２と次行リストポインタ７３には例えば何もデータは格納されない。
【０１４５】
尚、図１６に示すようなインデックスリスト５３の各リスト要素７０を、上記図３の場合と同様に、例えば“（２，３）リスト要素”等と呼ぶ場合がある。
また、尚、図１６に示す例では、列方向の連結は先頭列リスト要素のみであったが、この例に限らない。例えば、図１６のような５列の構成において、１列〜５列の何れかの列のみ、列方向の連結が行われてもよいし、全ての列において列方向の連結が行われてもよい。
【０１４６】
上記構造のインデックスリスト５３を用いてデータファイル６０の任意のデータを参照するには、先頭列リスト要素のなかから該当する行の先頭列リスト要素を見つける。次に、見つけた先頭列リスト要素から列方向に該当する列番目のリスト要素７０を見つけてこれを参照すれば良い。例えば、３行４列目のデータを参照したい場合には、“（３，４）リスト要素”を見つけて参照すればよい。これは、例えば、rootリスト要素を起点にして次行リストポインタ７３を用いて先頭列リスト要素を辿ることで、ここでは３番目の先頭列リスト要素（図示の“（３，１）リスト要素”）を見つける。次に、この“（３，１）リスト要素”から次列リストポインタ７５を参照して行方向のリンクを辿り、４番目のリスト要素７０（図示の“（３，４）リスト要素”）を見つけて、そのデータポインタ７１を参照すれば良い。
【０１４７】
つまり、ｍ行ｎ列目のデータが指定された場合には、まず、rootリスト要素を起点にして、次行リストポインタ７３を用いることで列方向にｍ番目のリスト要素７０を見つけ、更にそこから次列リストポインタ７５を用いることで行方向にｎ番目のリスト要素７０を見つけることで、目的とするリスト要素７０を取得して、この取得した利リスト要素７０のデータポインタ７１によって指定されたデータにアクセスすることができる。
【０１４８】
データファイル−インデックスリスト変換処理部５１は、インデックスリスト生成処理、またはデータファイル保存処理を実行する。インデックスリスト生成処理は、データファイル６０からインデックスリスト５３を生成する処理である。データファイル保存処理は、上記実施例１の場合と同様、更新後のインデックスリスト５３の内容をデータファイル６０に反映させて保存する処理である（データファイル６０を更新する処理である）。
【０１４９】
図１７は、実施例２におけるインデックスリスト生成処理の処理フローチャート図である。
図示の例では、まず、任意のデータファイル６０をオープンする（ステップＳ１１１）。
【０１５０】
そして、このデータファイル６０から１行分のデータを取得する毎に（ステップＳ１１２）、ステップＳ１１３以降の処理を実行する。
これは、まず、取得したデータがＥＯＦであるか否か、すなわちデータファイル６０の最後尾のデータかどうかを確認する（ステップＳ１１３）。取得したデータがＥＯＦであった場合（ステップＳ１１３，ＹＥＳ）、最下行の先頭列リスト要素の次行リストポインタ７３に“EOF”を登録して（ステップＳ１１４）、データファイル６０をクローズして（ステップＳ１１５）、インデックスリスト生成処理を終了する。
【０１５１】
一方、取得したデータがＥＯＦでは無かった場合（ステップＳ１１３，ＮＯ）、ステップＳ１１２で取得した１行分のデータ群から１データずつ切り出して、１データずつ処理対象にして、ステップＳ１１７以降の処理を実行する。すなわち、各データに対応するリスト要素７０を生成する処理を実行する。
【０１５２】
これは、図１５に示すフォーマットのリスト要素７０（未だ、各ポインタは格納されていない）に対して、まず、そのデータポインタ７１に、処理対象のデータへのポインタを格納する（ステップＳ１１７）。
【０１５３】
次に、上記処理対象の１行分のデータ群における上記切り出した１データの取得位置を判別する（ステップＳ１１８）。１データの取得位置が、行先頭であった場合にはステップＳ１１９，Ｓ１２０の処理、行途中であった場合にはステップＳ１２１，１２２の処理、行末であった場合にはステップＳ１２３〜Ｓ１２５の処理を実行する。図示のように、行先頭または行途中の場合には、処理後にステップＳ１１６に戻って次の１データ切り出す。一方、行末の場合には処理後にステップＳ１１２に戻り、次の１行分のデータ群を読み出して上記と同様の処理を行う。尚、ステップＳ１１８の処理は、例えば、最初に切り出したデータを行先頭と判定し、それ以外のデータについては、そのデータの次に区切り記号（カンマ等）があれば行途中と判定し、改行記号があれば行末と判定する。
【０１５４】
処理対象データが行先頭であった場合、まず、一つ前の行のリスト要素７０の次行リストポインタ７３に、自リスト要素７０へのポインタを登録する（ステップＳ１１９）。更に、自リスト要素７０の前行リストポインタ７２に、一つ前の行のリスト要素７０へのポインタを登録する（ステップＳ１２０）。尚、rootリスト要素の場合には、これら登録は行われない。また、尚、上記「一つ前の行のリスト要素７０」は、例えば、これまでの処理で作成されたリスト要素７０群においてrootリスト要素を起点として次行リストポインタ７３によって各先頭列リスト要素を見つけ出し、最後の先頭列リスト要素、すなわち未だ次行リストポインタ７３が登録されていない先頭列リスト要素を見つけ出し、これを上記「一つ前の行のリスト要素７０」とするものである。
【０１５５】
そして、上記の通り、ステップＳ１１６に戻って次の１データ切り出す。
また、処理対象データが行途中であった場合には、まず、一つ前の列のリスト要素７０の次列リストポインタ７５に、自リスト要素７０へのポインタを登録する（ステップＳ１２１）。次に、自リスト要素７０の前列リストポインタ７４に、一つ前の列のリスト要素７０へのポインタを登録する（ステップＳ１２２）。尚、上記「一つ前の列のリスト要素７０」は、例えば、当該１行分のリスト要素７０生成処理において最後に生成したリスト要素７０を取得するものであってもよいし、未だ次列リストポインタ７５が登録されていないリスト要素７０を取得するものであってもよい。あるいは、上記「一つ前の行のリスト要素７０」の場合と同様にして最後の先頭列リスト要素を見つけ出し、この最後の先頭列リスト要素から更に次列リストポインタ７５によって行方向のリンクを辿ることによって上記「一つ前の列のリスト要素７０」を見つけ出してもよい。
【０１５６】
そして、上記の通り、ステップＳ１１６に戻って次の１データ切り出す。
また、処理対象データが行末であった場合には、まず、一つ前の列のリスト要素７０の次列リストポインタ７５に、自リスト要素７０へのポインタを登録する（ステップＳ１２３）。続いて、自リスト要素７０の前列リストポインタ７４に、一つ前の列のリスト要素７０へのポインタを登録する（ステップＳ１２４）。更に、自リスト要素７０の次列リストポインタ７５に、“EOL”を登録する（ステップＳ１２５）。
【０１５７】
そして、上記の通り、ステップＳ１１２に戻り、次の一行データを取得して、上記と同様の処理を実行する。
図１８に、上記インデックスリスト生成の具体例を示す。
【０１５８】
ここでは、図１８（ａ）に示すデータファイル６０から、上記図１７の処理によって、図１８（ｂ）に示すインデックスリスト５３が生成されている。
図１８（ａ）に示すように、データファイル６０には、４行４列のデータ群が格納されているものとする。このデータファイル６０に対して、図１７のインデックスリスト生成処理を実行すると、図１８（ｂ）に示すように、リスト要素７０を１６個持つインデックスリスト５３が生成される。
【０１５９】
この例では、例えば、図示のインデックスリスト５３における２行１列のリスト要素７０（先頭列リスト要素“yellow”）を例にすると、この“yellow”のリスト要素７０においては、その前行リストポインタ７２には１行目の先頭列リスト要素“red”へのポインタ、次行リストポインタ７３には３行目の先頭列リスト要素“white”へのポインタ、次列リストポインタ７５には同じ行の２列目のリスト要素“black”へのポインタが格納されることになる。この２行２列目の“black”のリスト要素７０においては、その前列リストポインタ７４には先頭列リスト要素“yellow”へのポインタ、次列リストポインタ７５には同じ行の３列目のリスト要素“silver”へのポインタが登録されることになる。
【０１６０】
上記のようにデータファイル６０からインデックスリスト５３を生成した後は、インデックスリスト５３を用いてデータファイル６０上の任意のデータにアクセス（参照、更新等）できる。
【０１６１】
尚、後述する図２１、図２３に示す追加処理、挿入処理それぞれの具体例では、上記図１８（ｂ）に示すインデックスリスト５３に対する追加処理、挿入処理を例にする。よって、図２１（ａ）、図２３（ａ）に示すインデックスリスト５３は、図１８（ｂ）に示すものと同じである。
【０１６２】
図１９は、実施例２におけるデータファイル保存処理の処理フローチャート図である。
図１９の処理では、まず、保存先のデータファイル６０をオープンする（ステップＳ１３１）。そして、処理対象のインデックスリスト５３を参照して、ステップＳ１３２以降の処理を実行する。図示していないが、まず、インデックスリスト５３の上記rootリスト要素を取得する。これは、最初の先頭列リスト要素を取得するものである。
【０１６３】
そして、取得した先頭列リスト要素（上記の通り、最初はrootリスト要素）の次行リストポインタ７３を保存する（ステップＳ１３２）。これは、後のステップＳ１３８の処理の際に用いられる。
【０１６４】
次に、取得したリスト要素７０（上記の通り、最初はrootリスト要素であるが、以降はステップＳ１３９で取得した他の先頭列リスト要素、あるいはステップＳ１３６で取得した先頭列リスト要素以外のリスト要素となる）のデータポインタ７１が示すデータをファイルに格納する（ステップＳ１３３）。そして、このデータ格納先のアドレス等を示すポインタを新たなデータポインタ７１とする。これは上記ステップＳ３２と略同様の処理である。
【０１６５】
次に、処理対象のリスト要素７０（上記取得したリスト要素７０）の次列リストポインタ７５を参照し、“EOL”であるか否かを判定する（ステップＳ１３４）。つまり、処理対象のリスト要素７０が、任意の行の最後の列のリスト要素７０であるか否かを判定する。
【０１６６】
“EOL”ではない場合（ステップＳ１３４，ＹＥＳ）、ファイルに区切り記号（カンマ等）を挿入し（ステップＳ１３５）、当該処理対象のリスト要素７０の次列リストポインタ７５に従って同じ行の次の列のリスト要素７０を取得する（ステップＳ１３６）。そして、ステップＳ１３３に戻り、上記と同様の処理を実行する。
【０１６７】
一方、判定の結果、“EOL”であった場合（ステップＳ１３４，ＮＯ）、ファイルに改行記号を挿入し（ステップＳ１３７）、続いて、上記ステップＳ１３２で保存していた次行リストポインタ７３が“EOF”であるか否かを判定する（ステップＳ１３８）。
【０１６８】
“EOF”ではない場合（ステップＳ１３８，ＹＥＳ）、上記ステップＳ１３２で保存していた次行リストポインタ７３に従って次の行の先頭列リスト要素を取得し（ステップＳ１３９）、ステップＳ１３２に戻り、上記と同様の処理を実行する。
【０１６９】
一方、判定の結果、“EOF”であった場合には(ステップＳ１３８，ＮＯ)、データファイル６０を閉じて（ステップＳ１４０）、データファイル保存処理を終了する。
インデックスリスト操作処理部５２は、追加処理、挿入処理、削除処理を実行する。
【０１７０】
追加処理は、データファイル６０に任意の行データあるいは列データを追加する為に、インデックスリスト５３を更新する処理である。挿入処理は、データファイル６０の任意の行あるいは列の途中に、任意の行データあるいは列データを挿入する為に、インデックスリスト５３を更新する処理である。削除処理は、データファイル６０から、任意の行あるいは列を削除する為に、インデックスリスト５３を更新する処理である。
【０１７１】
何れも、実施例１と同様に、複数行または複数列を一度に追加、挿入、削除可能である。
尚、インデックスリスト５３を更新することで実質的にデータファイル６０が更新される理由、インデックスリスト５３更新後等に上記図１９のデータファイル保存処理を行う理由は、既に実施例１で述べており、ここでは説明しない。
【０１７２】
本実施例では、インデックスリスト５３に対応するデータファイル６０は、Ｍ行Ｎ列であるものとして説明する。また、ｉ行ｊ列目のデータに対応するリスト要素７０を“（ｉ，ｊ）リスト要素”と表現して説明する。あるいは、図２１等に示す具体例においては、上記図８等と同様、図上に示す“red”、“blue”等により各リスト要素７０を表現する場合もある。
【０１７３】
上記インデックスリスト操作処理部５２による追加処理、挿入処理、削除処理の処理フローチャート図を、それぞれ、図２０、図２２、図２４に示し、以下、これらのフローチャート図面を参照して説明する。また、図２１、図２３、図２５に、追加処理、挿入処理、削除処理それぞれの具体例を示し、これらも参照して説明する場合もある。
【０１７４】
図２０は、実施例２における追加処理の処理フローチャート図である。
ここでは、ｋ行の行データ又はｋ列の列データを追加するものとして説明する。
図２０の処理では、まず、行データを追加するのか、列データを追加するのかを判定する（ステップＳ１５１）。行データを追加する場合にはステップＳ１５２〜Ｓ１５４の処理を実行する。列データを追加する場合にはステップＳ１５５〜Ｓ１６０の処理を実行する。
【０１７５】
行データを追加する場合、まず、上記Ｍ行Ｎ列のインデックスリスト５３の“（Ｍ、１）リスト要素”を取得する（ステップＳ１５２）。つまり、現在の（更新前の）インデックスリスト５３の最下行の先頭列リスト要素を取得する。図２１（ａ）に示す例では、“（４、１）リスト要素”すなわち“silver”を取得することになる。
【０１７６】
尚、図２１は、実施例２における行／列の追加の具体例を示す図であり、図２１（ａ）に示すインデックスリスト５３に対して、図２１（ｂ）に示す列データを追加し、更に図２１（ｃ）に示す行データを追加することで、図２１（ｄ）に示すインデックスリスト５３へと更新する例を示している。
【０１７７】
尚、上記「図２１（ｂ）に示す列データ」や「図２１（ｃ）に示す行データ」とは、追加する列データ、行データそのものではなく、上記実施例１で説明した列データの追加リスト要素群、行データの追加リスト要素群を意味するものであるが、実施例２の説明では、簡単の為、上記の通り省略して記載するものとする。これは、後述する挿入処理等においても同様であり、よって、上記図２１の説明に限らず、実施例２の説明においては、基本的に、インデックスリスト５３に対して追加、挿入する列データ、行データとは、上記実施例１で説明した列データの追加リスト要素群、行データの追加リスト要素群を意味する。
【０１７８】
ここで、図２１（ｂ）に示す列データ、図２１（ｃ）に示す行データは、何れも、図２１（ａ）に示すインデックスリスト５３と同様の形式で相互に連結されている。
尚、実施例１での説明と同様、図２１（ｂ）（ｃ）に示す列データ、行データの各追加リスト要素７０同士の連結やそのデータポインタ７１の設定は、予め行われているものとする（よって、追加データ群もデータファイル６０等に追加格納されている）。これは、インデックスリスト５３と同様の形式で相互に連結されている。例えば、図２１（ｂ）には３列の列データを追加する例を示すが、図示の通り、各行の先頭の列の追加リスト要素７０同士が（図示の“silver2”、“brown2”、“yellow2”、“black2”）、前行リストポインタ７２、次行リストポインタ７３によって連結されている。つまり、上記先頭列リスト要素に相当する追加リスト要素同士は、列方向の連結が行われている。そして、各行毎に、上記先頭の列の追加リスト要素から順次、行方向の連結が行われている。これは、前列リストポインタ７４、次列リストポインタ７５とによって連結されているものである。また、各行毎の最後の列の追加リスト要素７０の次列リストポインタ７５には、上記“EOL”が登録されている。
【０１７９】
また、行データも上記列データと同様に、インデックスリスト５３と同様の形式で相互に連結されている。図２１（ｃ）の例では１行のみであるが、例えば２行あり、２行目の先頭の列の追加リスト要素を仮に“red2”とした場合、図２１（ｃ）に示す“silver1”と“red2”とが、前行リストポインタ７２、次行リストポインタ７３によって連結されていることになる。
【０１８０】
尚、上記図１６で説明したように、インデックスリスト５３の各リスト要素７０を、そのリスト要素７０が対応するデータの行／列を用いて、例えば“（３、１）リスト要素”等と呼ぶ場合もあるとしたが、上記の通り、行データ／列データもインデックスリスト５３と同様の形式であるので、同様にして呼ぶ場合もある。例えば、図２１（ｂ）に示す列データの“brown4”は例えば“（２、３）追加リスト要素”と呼ぶものとする。
【０１８１】
そして、例えばこの“（２、３）追加リスト要素”を取得したい場合には、上記インデックスリスト５３に関して説明したように、行データ／列データにおいて起点となる追加リスト要素（図２１（ｂ）の例では“（１、１）追加リスト要素”である“silver2”）から上記各リストポインタ７２〜７５を用いて、まず列方向、次に行方向へのリンクを辿ることで、取得したい追加リスト要素を見つけることができる。
【０１８２】
次に、ステップＳ１５２で取得した“（Ｍ、１）リスト要素”の次行リストポインタ７３に、追加する行データの先頭のリスト要素７０（“（１、１）追加リスト要素”）へのポインタを格納する（ステップＳ１５３）。図２１の例では、図２１（ｃ）に示す行データにおける“（１、１）追加リスト要素”である“silver1”へのポインタを、上記“silver”の次行リストポインタ７３に格納することになる。
【０１８３】
次に、追加する行データの先頭のリスト要素７０（上記の例では“silver1”）の前行リストポインタ７２に、“（Ｍ、１）リスト要素”へのポインタを登録する（ステップＳ１５４）。これにより、行データの追加処理は終了する。
【０１８４】
一方、上記ステップＳ１５１で列データを追加するものと判定された場合には、まず、行カウンタｉを１に初期化する（ステップＳ１５５）。
次に、上記Ｍ行Ｎ列のインデックスリスト５３の“（ｉ、Ｎ）リスト要素”を取得する（ステップＳ１５６）。これは、後述するステップＳ１６０によりｉを順次インクリメントしていくことで、インデックスリスト５３の各行毎に、その行の最後のリスト要素７０を取得する処理となる。図２１（ａ）の例では、ｉ＝１のときは“green”、ｉ＝２のときは“brown”が取得される。
【０１８５】
次に、取得した“（ｉ、Ｎ）リスト要素”の次列リストポインタ７５に、“（ｉ、１）追加リスト要素”へのポインタを登録する（ステップＳ１５７）。更に、この“（ｉ、１）追加リスト要素”の前列リストポインタ７４に、上記“（ｉ、Ｎ）リスト要素”へのポインタを登録する（ステップＳ１５８）。つまり、インデックスリスト５３におけるｉ行目の行の最後の列のリスト要素７０と、追加する列データにおけるｉ行目の行の先頭の列の追加リスト要素７０との行方向での連結を行う。
【０１８６】
次に、インデックスリスト５３における“（ｉ、１）リスト要素”、つまりｉ行の先頭列リスト要素において、その次行リストポインタ７３が“EOF”であるか否かを判定する（ステップＳ１５９）。
【０１８７】
“EOF”ではない場合（ステップＳ１５９，ＮＯ）、行カウンタｉを＋１インクリメントして（ステップＳ１６０）、ステップＳ１５６に戻り、上記と同様の処理を行う。一方、“EOF”であった場合（ステップＳ１５９，ＹＥＳ）、列データの追加処理を終了する。
【０１８８】
上述した追加処理により、例えば図２１に示す例では、図２１（ａ）の４行４列のインデックスリスト５３に対して、まず、図２１（ｂ）の３列（４行３列）の列データを追加する処理を行った結果、図２１（ｄ）における１〜４行目までに示すように、インデックスリスト５３の各行の最後の列のリスト要素７０に対して、図２１（ｂ）の列データの各行の先頭の追加リスト要素７０が連結されることで、４行７列のインデックスリスト５３へと更新される。更に、図２１（ｃ）の１行（１行７列）の行データを、この４行７列のインデックスリスト５３に追加する処理を行った結果、図２１（ｄ）に示すように“silver”と“silver1”とが行リストポインタ72,73により相互に連結されることで、５行目に行データが追加されたものとなり、図示のように５行７列のデータ群を表すインデックスリスト５３へと更新される。
【０１８９】
上記のように、インデックスリスト５３に対して、任意の行数の行データ、任意の列数の列データを追加することができる。これによって実質的にデータファイルに行単位／列単位でデータ追加されたものとなる。
【０１９０】
尚、ステップＳ４７〜Ｓ５０の処理に関して説明したものと同様に、ｉを順次インクリメントしつつ例えば図２１（ｂ）に示す追加リスト要素群から１行ずつ１行分の追加リスト要素をインデックスリスト５３へ追加することで、この１行分の追加リスト要素は追加リスト要素群から削除されると考えることもできる。よって、上記ステップＳ１５７，Ｓ１５８における「（ｉ，１）追加リスト要素」を「（１，１）追加リスト要素」に置き換えても良い。これは、後述するステップＳ１８１〜Ｓ１８４の処理においても同様に考えることもでき、これら処理における「（ｉ，１）挿入リスト要素」を「（１，１）挿入リスト要素」に、「（ｉ，ｋ）挿入リスト要素」を「（１，ｋ）挿入リスト要素」に置き換えてもよい。
【０１９１】
但し、ここでは、１行分の追加リスト要素をインデックスリスト５３へ追加後も列方向のリンクは切れないので（少なくとも図２０や図２２に示す例ではポインタ７２，７３は削除されないので）、例えば図２１（ｂ）に示す“silver2”はインデックスリスト５３へ追加後も“（１，１）追加リスト要素”と見做すことができるので、上記ステップＳ１５７，Ｓ１５８の処理を行うものとする。これは、後述するステップＳ１８１〜Ｓ１８４の処理に関しても同様である。
【０１９２】
尚、この場合、例えば、ポインタ７３は登録されているがポインタ７２は未登録の追加リスト要素を、追加リスト要素群のルート要素（すなわち、“（１，１）追加リスト要素”）と判定し、これを起点にして所望の追加リスト要素を求めることができる。
【０１９３】
図２２は、実施例２における挿入処理の処理フローチャート図である。
ここでは、ｎ行目にｋ行の行データ又はｎ列目にｋ列の列データを挿入するものとして説明する。
【０１９４】
まず、行データを挿入するのか、列データを挿入するのかを判定する（ステップＳ１７１）。
行データを挿入する場合にはステップＳ１７２〜Ｓ１７７の処理を実行し、列データを挿入する場合にはステップＳ１７８〜Ｓ１８６の処理を実行する。
【０１９５】
まず、行データを挿入する場合について説明する。
この場合、まず、インデックスリスト５３の“（ｎ−１、１）リスト要素”を取得する（ステップＳ１７２）。そして、この“（ｎ−１、１）リスト要素”の次行リストポインタ７３の指すリスト要素７０を取得する（ステップＳ１７３）。つまり、行データ挿入する箇所の前後の各行の先頭列リスト要素を取得する。
【０１９６】
ここで、例えば図２３に実施例２における行／列挿入の具体例を示す。図示の例では、図２３（ａ）に示す４行４列のインデックスリスト５３に対して、まず、その4列目（３列目と４列目の間の意味）に図２３（ｂ）に示す１列（４行１列）の列データを挿入し、更に、その４行目（３行目と４行目の間という意味）に、図２３（ｃ）に示す１行（１行５列）の行データを挿入する例を示している。この例では、上記ステップＳ１７２で“（３，１）リスト要素”すなわち“white”を取得し、ステップＳ１７３では“（４，１）リスト要素”すなわち“silver”を取得することになる。
【０１９７】
次に、上記“（ｎ−１、１）リスト要素”の次行リストポインタ７３に、挿入する行データの先頭のリスト要素７０（“（１、１）挿入リスト要素”）へのポインタを登録する（ステップＳ１７４）。更に、この“（１、１）挿入リスト要素”の前行リストポインタ７２に、上記“（ｎ−１、１）リスト要素”へのポインタを登録する（ステップＳ１７５）。
【０１９８】
次に、ステップＳ１７３で取得したリスト要素７０の前行リストポインタ７２に、挿入する行データの“（ｋ、１）挿入リスト要素”へのポインタを登録する（ステップＳ１７６）。上記“（ｋ、１）挿入リスト要素”は、ｋ行からなる行データにおける最後の行（ｋ行目）の先頭の列のリスト要素（先頭列リスト要素に相当）を意味することになる。更に、上記行データの“（ｋ、１）挿入リスト要素”の次行リストポインタ７３に、ステップＳ１７３で取得したリスト要素７０へのポインタを登録する（ステップＳ１７７）。
【０１９９】
以上で、行データの挿入処理を終了する。
尚、図２３の例では、ｋ＝１であることから“（ｋ、１）挿入リスト要素”は“（１、１）挿入リスト要素”を意味するものとなり、図示の“silver1”のみが取得されることになり、図２３（ｄ）に示すように、上記ステップＳ１７４，Ｓ１７５により“white”と“silver1”とが連結され、上記ステップＳ１７６，Ｓ１７７により“silver1”と“silver”とが連結されることになる。
【０２００】
上記のように、ｋ行の行データの挿入の場合の処理は、インデックスリスト５３における挿入箇所の前後の各先頭列リスト要素と、ｋ行の行データにおける１行目とｋ行目の各先頭の列のリスト要素（上記のように１つの場合もある）とが、連結されること（列方向での連結）により、ｋ行の行データに対応する挿入リスト要素群が、挿入箇所に挿入されることになる。
【０２０１】
次に、以下、列データを挿入する場合について説明する。
この場合は、まず、行カウンタｉを１に初期化する（ステップＳ１７８）。
次に、インデックスリスト５３の“（ｉ、ｎ−１）リスト要素”を取得する（ステップＳ１７９）。更に、取得した“（ｉ、ｎ−１）リスト要素”の次列リストポインタ７５の示すリスト要素７０を取得する（ステップＳ１８０）。つまり、挿入すべき箇所の前後（行方向での前後）のリスト要素７０を取得する。
【０２０２】
ここで、例えば図２３の例では、図２３（ａ）に示すインデックスリスト５３に対して、その４列目（３列目と４列目の間という意味）に、図２３（ｂ）に示す１列の列データを挿入する例を示している。この例では、ｎ＝４、ｋ＝１であるので、例えばｉ＝１のとき（処理対象が１行目の場合）には、上記ステップＳ１７９で“（１，３）リスト要素”すなわち“white”を取得し、ステップＳ１８０では“（１，４）リスト要素”すなわち“green”を取得することになる。
【０２０３】
次に、上記“（ｉ、ｎ−１）リスト要素”の次列リストポインタ７５に、挿入する列データの“（ｉ、１）挿入リスト要素”へのポインタを登録する（ステップＳ１８１）。更に、上記“（ｉ、１）挿入リスト要素”の前列リストポインタ７４に、上記“（ｉ、ｎ−１）リスト要素”へのポインタを登録する（ステップＳ１８２）。すなわち、インデックスリスト５３における挿入箇所の直前の列のリスト要素７０と、挿入するｋ列の列データにおける先頭の列（１列目）の挿入リスト要素とを連結する処理を、後述するステップＳ１８６でｉを順次インクリメントしていくことで各行（ｉ行）毎に行うものである。
【０２０４】
次に、ステップＳ１８０で取得したリスト要素７０の前列リストポインタ７４に、挿入する列データの“（ｉ、ｋ）挿入リスト要素”へのポインタを登録する（ステップＳ１８３）。更に、上記“（ｉ、ｋ）挿入リスト要素”の次列リストポインタ７５に、ステップＳ１８０で取得したリスト要素７０へのポインタを登録する（ステップＳ１８４）。すなわち、インデックスリスト５３における挿入箇所の直後の列のリスト要素７０と、挿入するｋ列の列データにおける最後の列（ｋ列目）の挿入リスト要素とを連結する処理を、後述するステップＳ１８６でｉを順次インクリメントしていくことで各行（ｉ行）毎に行うものである。
【０２０５】
尚、図２３（ｂ）に示す例のようにｋ＝１の場合には、“（ｉ、１）挿入リスト要素”と“（ｉ、ｋ）挿入リスト要素”は同じものとなり、この１つの挿入リスト要素に対して上記ステップＳ１８１〜Ｓ１８４による連結処理を行うことになる。
【０２０６】
そして、インデックスリスト５３の“（ｉ、１）リスト要素”すなわち現在の処理対象の行（ｉ）の先頭列リスト要素の次行リストポインタ７３が、“EOF”であるか否か、すなわち最後の行まで挿入が行われたかを判定する（ステップＳ１８５）。
【０２０７】
“EOF”でない場合（ステップＳ１８５，ＮＯ）、行カウンタｉを＋１インクリメントして、ステップＳ１７９に戻り、上記と同様の処理を行う。一方、“EOF”であった場合（ステップＳ１８５，ＹＥＳ）、挿入処理を終了する。
【０２０８】
図２３に示す例では、上記の通り、図２３（ａ）に示す内容のインデックスリスト５３に対して、図２３（ｂ）に示す４行１列の列データを４列目に挿入し、続けて、図２３（ｃ）に示す１行５列の行データを４行目に挿入する。
【０２０９】
まず、上記列データの挿入処理を実行すると、インデックスリスト５３は、４列目に１列の列データが挿入された、４行５列のデータを表すリストに更新される。次に、上記行データの挿入処理を実行すると、インデックスリスト５３は、更に４行目に１行の行データが挿入された、５行５列のデータを表すリストに更新される。
【０２１０】
上記のようにして、インデックスリスト５３の任意の挿入位置に、任意の行数／列数の行データ及び列データを挿入することができ、これによって上記の通り実質的にデータファイルにおいて行単位／列単位でデータ挿入されたものとする。
【０２１１】
図２４は、実施例２における削除処理の処理フローチャート図である。
本実施例では、ｎ行目からｋ行分のデータ又はｎ列目からｋ列分のデータを削除するものとして説明する。
【０２１２】
まず、行を削除するのか、列を削除するのかを判定する（ステップＳ１９１）。
行を削除する場合はステップＳ１９２〜Ｓ１９５の処理を実行する。列を削除する場合にはステップＳ１９６〜Ｓ２０２の処理を実行する。
【０２１３】
まず、行を削除する場合について説明する。
この場合、まず、インデックスリスト５３から“（ｎ−１、１）リスト要素”を取得し（ステップＳ１９２）、更に“（ｎ＋ｋ、１）リスト要素”を取得する（ステップＳ１９３）。これは、削除する行（ｎ行目〜ｎ＋ｋ行目まで）の１つ前の行（直前の行）と１つ後の行（直後の行）の２つの行それぞれの先頭列リスト要素を取得する処理である。
【０２１４】
ここで、図２５に、削除処理の具体例を示す。この例では、図２５（ａ）に示す５行５列のインデックスリスト５３から、その３行目から１行分のデータ（つまり、３行目だけ）を削除し、その３列目から２列分のデータ（つまり、３列目と４列目のデータ）を削除することで、図２５（ｂ）に示す４行３列のインデックスリスト５３に更新する例を示している。この例では、ステップＳ１９２では２行１列の“yellow”、ステップＳ１９３では４行１列の“silver1”が取得されることになる。
【０２１５】
次に、上記“（ｎ−１、１）リスト要素”の次行リストポインタ７３に、上記“（ｎ＋ｋ、１）リスト要素”へのポインタを登録する（ステップＳ１９４）。更に、“（ｎ＋ｋ、１）リスト要素”の前行リストポインタ７２に、“（ｎ−１、１）リスト要素”へのポインタを登録する(ステップＳ１９５)。これによって、ｎ行目からｋ行分のデータはインデックスリスト５３から除外されたものとなり、削除処理は終了する。図２５の例では、“yellow”と“silver1”とが行リストポインタ７２，７３により連結されることで、３行目のデータに対応するリスト要素群が削除されることになる。
【０２１６】
一方、列を削除する場合には、まず、行カウンタｉを１に初期化する（ステップＳ１９６）。
次に、インデックスリスト５３の“（ｉ、ｎ−１）リスト要素”を取得し（ステップＳ１９７）、更に“（ｉ、ｎ＋ｋ）リスト要素”を取得する（ステップＳ１９８）。すなわち、インデックスリスト５３の各行（ｉで示す）毎に、削除する列（または列群）の１つ前の（直前の）列のリスト要素７０と１つ後の（直後の）列のリスト要素７０とを取得する。図２５に示す例では、例えばｉ＝１のときには、１行２列の“blue”と、１行５列の“green”とが取得されることになる。
【０２１７】
そして、取得した２つのリスト要素７０同士を連結する。すなわち、上記ステップＳ１９７で取得した“（ｉ、ｎ−１）リスト要素”の次列リストポインタ７５に、ステップＳ１９８で取得した“（ｉ、ｎ＋ｋ）リスト要素”へのポインタを登録する（ステップＳ１９９）。更に、“（ｉ、ｎ＋ｋ）リスト要素”の前列リストポインタ７４に、“（ｉ、ｎ−１）リスト要素”へのポインタを登録する（ステップＳ２００）。
【０２１８】
次に、インデックスリスト５３の“（ｉ、１）リスト要素”すなわちｉ行の先頭列リスト要素の次行リストポインタ７３が“EOF”であるか否かを判定する（ステップＳ２０１）。つまり、最後の行について処理実行したものか否かを判定する。
【０２１９】
“EOF”でない場合（ステップＳ２０１，ＮＯ）、行カウンタｉを＋１インクリメントして（ステップＳ２０２）、ステップＳ１９７に戻り、上記と同様の処理を実行する。一方、“EOF”であった場合（ステップＳ２０１，ＹＥＳ）、削除処理を終了する。
【０２２０】
図２５に示す例では，ｉ＝５のときには、“（ｉ、１）リスト要素”は５行１列の“silver”であり、図示の例で５行目が最後の行であることから、その次行リストポインタ７３は“EOF”となっているので、ステップＳ２０１の判定はＹＥＳとなる。
【０２２１】
図２５の例では、図２５（ａ）に示す５行５列のインデックスリストから、まず３〜４列目の列データに対応するリスト要素群を削除し、続けて、４行目の行データに対応するリスト要素群を削除している。
【０２２２】
まず、例えばユーザ等によりｎ＝３、ｋ＝２の指定での列削除が指示されると、上記ステップＳ１９６〜Ｓ２０２の処理を実行することで、図２５（ａ）のインデックスリスト５３から、データファイル６０の３〜４列目に相当する列データが削除される。次に、ｎ＝４、ｋ＝１の指定での行削除が指示されると、上記ステップＳ１９２〜Ｓ１９５の行削除処理を実行することで、上記インデックスリスト５３からデータファイル６０の４行目に相当する行データが削除される。その結果、図２５（ｂ）に示す４行３列のデータを表すインデックスリスト５３に更新される。
【０２２３】
このようにして、インデックスリストから、任意の行データ、任意の列データを削除することができる。これによって、実質的にデータファイルから行単位／列単位でデータ削除されることになる。
【０２２４】
図２６には、上記削除処理により図２５（ｂ）の内容へと更新されたインデックスリスト５３に基づいて、上記図１９の処理により新たなデータファイル６０を生成する具体例を示す。
【０２２５】
図２６（ａ）には上記図２５（ｂ）の内容のインデックスリスト５３を示す。すなわち、上記削除処理を実行することで更新された、４行３列のデータを表すインデックスリスト５３を示す。このリスト５３に基づいて、このリスト５３に対応するデータファイル６０を上記図１９の処理により生成する。この場合、図２６（ｂ）に示す内容、すなわち４行３列のデータより成るデータファイル６０が生成されることになる。
【０２２６】
これは、実施例１と同様、削除処理によって更新されたインデックスリスト５３に限らず、追加処理や挿入処理で更新されたインデックスリスト５３についても同様に、上記図１９の処理を実行することで、更新後のインデックスリスト５３の内容に応じたデータファイル６０が生成されることになる。
【０２２７】
以上説明したように、実施例２におけるインデックスリスト７０（図１５の構造）に対して行った、データの追加、挿入、削除といった操作の結果を、データファイルに反映することができる。
【０２２８】
以上説明したように、実施例２の方式によって以下の効果が得られる。
データファイルの構造を解析し、内容を要約してデータファイル上の各行の先頭のデータと関連付けた先頭列リスト要素と、各行毎にこの先頭列リスト要素を起点として連結された各リスト要素とから構成されたインデックスリストを生成し、生成したインデックスリストに対して操作を行うことによって、データファイル上の個々のデータに対して参照・編集ができ、さらにデータファイルに対して行・列単位でのデータの追加・挿入・削除といった操作が可能となる。
【０２２９】
最後に、図２７に、上記実施例１，２のデータファイル操作システムのハード構成例を示す。
データファイル操作システムは、例えばサーバ装置、パーソナルコンピュータ（パソコン）の汎用のコンピュータにより実現される。
【０２３０】
図２７に示すコンピュータ８０は、ＣＰＵ８１、メモリ８２、入力部８３、出力部８４、記憶部８５、記録媒体駆動部８６、及びネットワーク接続部８７を有し、これらがバス８８に接続された構成となっている。
【０２３１】
ＣＰＵ８１は、コンピュータ８０全体を制御する中央処理装置である。
メモリ８２は、任意の処理実行の際に、記憶部８５（あるいは可搬型記録媒体８９）に記憶されているプログラムあるいはデータを一時的に格納するＲＡＭ等のメモリである。ＣＰＵ８１は、メモリ８２に読み出したプログラム／データを用いて、各種処理を実行する。
【０２３２】
出力部８４は、例えばディスプレイ等であり、入力部８３は、例えば、キーボード、マウス等である。
ネットワーク接続部８７は、例えば任意の不図示のネットワークに接続して、他の不図示の情報処理装置との通信（コマンド／データ送受信等）を行う為の構成である。
【０２３３】
記憶部８５は、例えばハードディスク等であり、上記データファイル操作システムにおける各種処理を、ＣＰＵ８１により実現させる為のアプリケーションプログラムが格納されている。すなわち、上記実施例１、２のデータファイル操作システムにおけるデータファイル操作部１０、５０の各種処理機能を、ＣＰＵ８１により実現させる為のアプリケーションプログラムが格納されている。これは、データファイル操作部１０に関しては、そのデータファイル−インデックスリスト変換処理部１１や、インデックスリスト操作処理部１２による各種処理機能を実現させるものであり、例えば図４、図６、図７、図９、図１１の各フローチャート図の処理を実現させるものである。同様に、データファイル操作部５０に関しては、そのデータファイル−インデックスリスト変換処理部５１や、インデックスリスト操作処理部５２による各種処理機能を実現させるものであり、例えば図１７、図１９、図２０、図２２、図２４の各フローチャート図の処理を実現させるものである。
【０２３４】
また、記憶部８５には、更に、上記データファイル２０、６０が記憶されるものであってもよい。つまり、記憶部８５が上記データベースとして用いられてもよい。但し、この例に限らず、データファイル２０、６０を記憶するデータベース装置が別途存在してもよい。また、インデックスリスト１３と最大列番号、あるいはインデックスリスト５３は、例えばメモリ８２に記憶されるが、この例に限らず、記憶部８５に記憶されてもよい。
【０２３５】
上記のように、ＣＰＵ８１は、例えば上記記憶部８５に格納されている各種プログラムを読み出し・実行することにより、上記データファイル操作部１０、５０としての各種処理を実現するが、この例に限らず、上記記憶部８５に格納される各種プログラム／データは、可搬型記録媒体８９に記憶されているものであってもよい。この場合、可搬型記録媒体８９に記憶されているプログラム／データは、記録媒体駆動部８６によって読み出される。可搬型記録媒体８９とは、例えば、ＦＤ（フレキシブル・ディスク）８９ａ、ＣＤ−ＲＯＭ８９ｂ、その他、ＤＶＤ、光磁気ディスク等である。
【０２３６】
あるいは、また、上記プログラム／データは、ネットワーク接続部８７により接続しているネットワークを介して、他の装置内に記憶されているものをダウンロードするものであってもよい。あるいは、更に、インターネットを介して、外部の他の装置内に記憶されているものをダウンロードするものであってもよい。
【０２３７】
また、本発明は、上記本発明の各種処理をコンピュータ上で実現するプログラムを記録した可搬型記憶媒体として構成できるだけでなく、当該プログラム自体として構成することもできる。
【図面の簡単な説明】
【０２３８】
【図１】実施例１に係るデータファイル操作システムの構成図である。
【図２】実施例１におけるリスト要素のデータ構成図である。
【図３】実施例１におけるインデックスリストのリスト構造例である。
【図４】実施例１におけるインデックスリスト生成処理の処理フローチャート図である。
【図５】（ａ）、（ｂ）はインデックスリスト生成の具体例を示す図である。
【図６】実施例１におけるデータファイル保存処理の処理フローチャート図である。
【図７】実施例１における追加処理の処理フローチャート図である。
【図８】（ａ）〜（ｄ）は行／列追加の具体例を示す図である。
【図９】実施例１における挿入処理の処理フローチャート図である。
【図１０】（ａ）〜（ｄ）は行／列挿入の具体例を示す図である。
【図１１】実施例１における削除処理の処理フローチャート図である。
【図１２】（ａ）、（ｂ）は行／列削除の具体例を示す図である。
【図１３】（ａ）、（ｂ）は更新後のインデックスリストに基づくデータファイル生成の具体例を示す図である。
【図１４】実施例２のデータファイル操作システムの構成図である。
【図１５】実施例２におけるリスト要素のデータ構成図である。
【図１６】実施例２におけるインデックスリストのリスト構造例である。
【図１７】実施例２におけるインデックスリスト生成処理の処理フローチャート図である。
【図１８】（ａ）、（ｂ）はインデックスリスト生成の具体例を示す図である。
【図１９】実施例２におけるデータファイル保存処理の処理フローチャート図である。
【図２０】実施例２における追加処理の処理フローチャート図である。
【図２１】（ａ）〜（ｄ）は行／列追加の具体例を示す図である。
【図２２】実施例２における挿入処理の処理フローチャート図である。
【図２３】（ａ）〜（ｄ）は行／列挿入の具体例を示す図である。
【図２４】実施例２における削除処理の処理フローチャート図である。
【図２５】（ａ）、（ｂ）は行／列削除の具体例を示す図である。
【図２６】（ａ）、（ｂ）は更新後のインデックスリストに基づくデータファイル生成の具体例を示す図である。
【図２７】実施例１，２のデータファイル操作システムのハード構成例である。
【図２８】特許文献１記載の従来技術を説明する為の図である。
【符号の説明】
【０２３９】
１０  データファイル操作部
１１  データファイル−インデックスリスト変換処理部
１２  インデックスリスト操作処理部
１３  インデックスリスト
２０  データファイル
３０  リスト要素
３１  データポインタ
３２  前リスト要素ポインタ
３３  次リスト要素ポインタ
５０  データファイル操作部
５１  データファイル−インデックスリスト変換処理部
５２  インデックスリスト操作処理部
５３  インデックスリスト
６０  データファイル
７０  リスト要素
７１  データポインタ
７２  前行リスト要素ポインタ
７３  次行リスト要素ポインタ
７４  前列リスト要素ポインタ
７５  次列リスト要素ポインタ
８０  コンピュータ
８１  ＣＰＵ
８２  メモリ
８３  入力部
８４  出力部
８５  記憶部
８６  記録媒体駆動部
８７  ネットワーク接続部
８８  バス
８９  可搬型記録媒体
【図２】
2010020643.tif 000003
【図３】
2010020643.tif 000004
【図４】
2010020643.tif 000005
【図５】
2010020643.tif 000006
【図６】
2010020643.tif 000007
【図７】
2010020643.tif 000008
【図８】
2010020643.tif 000009
【図９】
2010020643.tif 000010
【図１０】
2010020643.tif 000011
【図１１】
2010020643.tif 000012
【図１２】
2010020643.tif 000013
【図１３】
2010020643.tif 000014
【図１５】
2010020643.tif 000015
【図１６】
2010020643.tif 000016
【図１７】
2010020643.tif 000017
【図１８】
2010020643.tif 000018
【図１９】
2010020643.tif 000019
【図２０】
2010020643.tif 000020
【図２１】
2010020643.tif 000021
【図２２】
2010020643.tif 000022
【図２３】
2010020643.tif 000023
【図２４】
2010020643.tif 000024
【図２５】
2010020643.tif 000025
【図２６】
2010020643.tif 000026
【図２７】
2010020643.tif 000027
【図２８】
2010020643.tif 000028
【図１】
2010020643.tif 000029
【図１４】
2010020643.tif 000030