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

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

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

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

875閲覧

連番になっているcsvファイルを読み込みたい

goma_saba

総合スコア5

CSV

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/01/21 16:50

前提・実現したいこと

C++でvectorの配列になっているifstreamに連番の2種類のcsvファイルを読み込もうとしています。
ファイル構造は実行ファイルと同階層に2つの各csvの格納フォルダが配置されており、
その中に読み込む対象のcsvファイルがあります。

発生している問題・エラーメッセージ

forループで連番のcsvを順に読み込んでいるのですが、
最初の方は読み込めているもののある程度読み込んだところからパスは正しく設定されていると思うのですが、
読み込めなくなってしまいます。(fail()の実行結果がtrueになっています)
また、同じファイルでも読み込める場合と読み込めない場合がありました

該当のソースコード

C++

1 2#include <windows.h> 3#include <vector> 4#include <string> 5#include <filesystem> 6#include <fstream> 7#include <iostream> 8#include <sstream> 9 10void Readcsv() 11{ 12 vector <ifstream>CsvFile1;//csv1 13 vector <ifstream>CsvFile2;//csv2 14 15 CsvFile1.resize(8192); 16 CsvFile2.resize(8192); 17 18 int i; 19 20 for (i = 0; i < 8192; i++) 21 { 22 //csvファイル読み込み 23 filesystem::path csv1Pass;//csv1格納パス 24 filesystem::path csv2Pass;//csv2格納パス 25 26 char c0[16] = {}; 27 sprintf_s(c0, "%d.csv", i);//数値→文字列変換 28 29 csv1Pass= RootPass;//実行ファイルのパス(予め取得済) 30 csv1Pass.append("csvdir1");//csv1格納フォルダ名 31 csv1Pass.append(c0);//ファイル名を追加 32 33 string s0; 34 s0 = csv1Pass.string();//pathをstringに変換 35 CsvFile1[i].open(s0);//読み込み 36 37 //読み込み失敗時 38 if (CsvFile1[i].fail()) 39 { 40 log<<"csvFile1 "<<i<<".csv open failed"<<endl; 41 } 42 43 csv2Pass= RootPass;//実行ファイルのパス 44 csv2Pass.append("csvdir2");//csv2格納フォルダ名 45 csv2Pass.append(c0);//ファイル名を追加 46 47 string s1; 48 s1 = csv2Pass.string();//pathをstringに変換 49 CsvFile2[i].open(s1);//読み込み 50 51 //読み込み失敗時 52 if (CsvFile2[i].fail()) 53 { 54 log<<"csvFile2 "<<i<<".csv open failed"<<endl; 55 } 56 } 57 58} 59 60 61 62

試したこと

ログでの確認やブレークポイントを張って処理の様子を確認していたのですが、読み込めないファイルの規則性もバラバラで
いまいち原因がつかめませんでした。

補足情報(FW/ツールのバージョンなど)

開発環境はVisualStudio2019です

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

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

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

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

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

episteme

2020/01/21 19:40

同時にopenできるファイル数の制限(上限)に引っかかってないかしら。 読み終わった時点で明示的にcloseしたらどうなります?
goma_saba

2020/01/22 00:21

読み終わった時点でcloseしたところ読み込めたので同時にopen出来る上限を超えていたようです。 必要な時にcsvを読み込む処理だと読み込みを行っている部分で一瞬カクつくので 予め全部のcsvを読むようにしたかったのですが、上限に引っかかっていてはどうしようもないので 何か別の方法を考えようと思います。
guest

回答1

0

ベストアンサー

同時openの上限に阻まれてるなら、
可能なら全部メモリに読み込んでおくか、
それが無理ならキャッシュするか...
※ SQLiteなんかの高速軽量DB使うもアリ。

投稿2020/01/22 01:40

編集2020/01/22 03:42
episteme

総合スコア16614

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

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

dodox86

2020/01/22 01:49 編集

> それが無理ならキャッシュするか... N個のCSVファイルを1個のファイルにまとめあげて、必要なら共有モードで再オープンして並列に各CSVデータ相当にアクセスできるようにすると、面白そうに思いました。(思い付き)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問