C++初心者なのですが
CSVやテキストファイルを丸々コンソールに表示するには
char c;
char file_name[32];
cout << "ファイル名==>";
cin >> file_name;
ifstream MyFile(file_name);
while(MyFile.get(c))
cout << c;
これで解決できたのですが、
テキストファイルの何行目や
Excelの行や列だけを指定しコンソールに表示させることは出来るのでしょうか?
配列を使い数値を個々にしまう方法があれば
そちらも教えていただきたいです。
わかりにくい説明ですみませんがよろしくお願いします
なにがしたいのか良くわかりませんが、例えば1行単位で読み込むのなら std::getline
void testfunc(std::istream& is) {
std::string s;
while (std::getline(is, s)) {
std::cout << s << std::endl;
}
}
これで1行単位で読み込み、表示を行ってくれます。
n行目を表示したい、のであればそうすればいい。
各行の内容を配列に格納するのであれば
std::string s;
std::vector<std::string> v;
while (std::getline(is, s)) v.push_back(s);
とか。
Excel の xls ファイルはテキストではないので分析・表示は難しいです。
CSV ファイルならできるでしょうが、まじめに分析するとかなり面倒です。
> テキストファイルの何行目や
> Excelの行や列だけを指定しコンソールに表示させることは出来るのでしょうか?
できます。
Excelの方は詳しく知りませんので、他の識者の方にお任せするとして、
テキストファイル(CSVを含む)に関してなら、
単純に、ファイルから順番にデータを読み込んで、
希望のデータのみコンソールに出力すればOKです。
> これで解決できたのですが、
とありますが、これが何をやっているのか、なぜこれで表示できるのか、
理解されているでしょうか?
> 配列を使い数値を個々にしまう方法があれば
> そちらも教えていただきたいです。
これも、読み込んだデータを、適当に配列に代入していけばOKなはずです。
例えばCSVなら、1行分データを読み込んで、そのデータの中の先頭から、
順番にデータを区切る','が見つかれ間でのデータを1つ目の配列に代入し、
その次のデータを区切る','までを2つ目の配列に代入し・・・
と、続けていけばよいのでは?
文字列を数値型に変換する方法なら、過去ログなどを調べれば、いくらでも出てきそうですが、
strtol()等が使用できるでしょう。
返事が遅くなってしまいましてすみませんでした。
おかげさまで解決する事が出来ました。
ありがとうございます
1年ぶりのアクセスです。
csv に変換しなければならないのが、(私は)イヤですね。(失礼!)
## でも csv 方が処理は早いです。
Win2k/xp なら、以下の方法も比較的容易かつ、汎用的なのでは。
(win98/MEではやってませんが)
もしかしたら、MSDE も必要かもしれませんが。(^^;;
当然、Office も入れています。
---------------------------
.xls ファイル自体を解析するのは無意味です。
# というか違法?
なので、Excel ファイルをデータベースとして扱う、
"Microsoft OLE DB Provider for Microsoft Jet"
を使用するとよいでしょう。
->http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpado260/htm/mdrefadoprovinfo.asp
MFCアプリで恐縮ですが、以下のようにしています。
まずは、_Recordset を使用可能にするために、
stdafx.h で
#pragma warning( disable : 4146 )
#import "D:\Program Files\Common Files\System\ado\msado15.dll" \
no_namespace rename("EOF","EndOfFile")
#pragma warning( default : 4146 )
#include <comdef.h>
#include <atlbase.h>
を追加。
-------------------------------
CString csSheet = "Sheet1"; // シートを指定
CString csExp = "Excel 8.0"; // Excel を指定
CString csDS = "C:\\someone.xls"; // DataSource(ファイルパス)
CString csCmd;
CString csConn;
// SQL を用いる
csCmd.Format("SELECT `%s$`.* FROM FROM `%s$`", csSheet );
//接続文字列で JET を指定
csCnn.Format(
"Provider=Microsoft.Jet.OLEDB.4.0;"
"Data Source=%s;"
"Extended Properties=%s;",csDS,csExp );
_bstr_t bsConn = csConn;
_bstr_t bsCmd = csCmd;
_RecordsetPtr & spRs = NULL;
spRs->CreateInstance( "ADODB.Recordset" );
spRs->Open(bsCmd,bsConn,adOpenDynamic,adLockPessimistic,adCmdText);
// 処理をあとで追加
spRs->Close();
-------------------------------
もちろん HRESULT hr でリザルトコードのチェックをしてください。
長くなるので省略しました。
さらに1文ごとに
try{ fuctions(); } catch( _com_error e )
{ TRACE("%08x: %s\n", e.Error(); e.Description()); }
を行なうとデバッグが非常に楽です。
-------------------------------
以上で開いて閉じるだけのプログラムが動いたら、
実際にレコードのアクセス処理を追加します。
while(1)
{
enum PositionEnum pos;
spRs->get_AbsolutePosition( &pos );
if( pos == adPosEof ) break;
// 行の処理
spRs->MoveNext();
}
----------------------------------------
最後にカラムの取り出しを行ないます。
Excel の1行目はフィールド名が入っているものとし、
同じ名前が const char * szFileds[] に入っているものとします。
_variant_t va;
FieldsPtr spFld; // 行(ロウ)全体を保持
FieldPtr spField; // 各カラムを保持
spFld = spRs->GetFields();
for( nCnt = 0; nCnt < nMaxCnt; nCnt ++ )
{
spField = spFlds->GetItem( szField[nCnt] );
va = spField->GetValue();
spField->Release();
}
spFld->Release();
--------------------------------------------
_variant_t に値が入っていますが、
CString cs = (char *)(_bstr_t)( va );
とすれば、コード変換等を含めていろいろやってくれます。
# つっこみ禁止ne。
---
おっと、
(( va.vt == VT_NULL ) || ( va.vt == VT_EMPTY ))
のチェックを忘れずに。
---
あとは
int data = atoi( cs );
位ですか。
ちなみに、結構遅いです。
以上を、階層クラスとして
汎用 CRecSet
JET用 CJetRecSet
EXCEL用 CJetExcelRecSet
特定の xls ファイル用 CXXXJetExcelRecSet
などと実装しています。
以上、実際に動いているプログラムから抜粋して書いたものです。
参考まで。
## いやみなくらいに CString を使っていますが。(^^;;
追伸。
Excel から VCのエディタに「こぴぺ」すると
タブセパレートベクタ(TSV?)になるから、
Find/Replace で
タブを (",") に、
(^",) を (\t{ )に、
("$) を (}) に
変換すれば、
const char * data_mtx[][32] =
{
{ "","","","",.... },
.....
}
が簡単に作れるので、これを data.c などに保存し、コンパイル/リンクする
のが最も早いかも。やっつけ作業なら、よくやる手です。
読み込まなくてもいいのが便利。ファイル指定ができないのが欠点。
# 他人に見せるプログラムではやらないようにね。(^^;;
...にしてもタイトルの、「C++に表示」は意味不明だne。
ツイート | ![]() |