はじめまして。
mituhikoといいます。
VC++は超初心者です。
今回は皆様のお力を頂戴致したく、初めて書き込み致しました。
CSVファイルのいらなくなった列データを列ごとにまとめて削除出来る
ツールをVC++のMFC AppWizardのダイアログベースで作っています。
ファイルを読み込み保存するまではなんとか出来たのですが、
肝心の列データをまとめて編集するという処理が出来ません。
理想としては編集ボタンを押すと
編集用ダイアログボックスが開き、「何番目の列を削除しますか?」
と表示し、列番号を入力したら、読み込んだCSVファイルの該当する
列データが削除されるというツールを作りたいと考えております。
もし皆様の中で似たようなプログラムをVC++で作ったことがある
方がいれば教えてください。
インターネットのどこかにあるのを知ってる方がいればURLを
教えてください。それではお願いします。
つたない文章ですいません。
> 肝心の列データをまとめて編集するという処理が出来ません。
具体的にどういう処理をやっていてどこで詰まっているのか書くとレスがつきやすいと思いま
す。
CSVデータを内部でどのように保持しているかなども書くとよいかもしれません。
ひろぴーさん
アドバイスありがとうございます。
具体的に説明したいと思います。
CSVファイル(10万行*30列)のファイルがあって、
そのファイルの1列目から16列までと27列目を抜き出した、
新たなCSVファイルをVC++でツールを使って作りたいと考えています。
VC++を使う理由は画面上で作業をしたいからです。
よろしくお願いします。
CSVデータを内部でどのように保持しているか、は
超初心者なので私にはわかりません。
すいません。
>CSVデータを内部でどのように保持しているか、は
>超初心者なので私にはわかりません。
じゃあ、どうやってCSV形式のデーターをファイルから読み込んでいるんですか?
読み込んで保存できると書いていたのはどういうことなんですか?
ライブラリーかそういうCSV形式のデーターを扱うクラスかを使っているのなら
どういうものを使っているのか示して下さい
読める、書けるという事はどこかに保持しているということだと普通のプログラマーは
受け取ります
ひょっとして、一行単位に読めて、保存できるということでしょうか???
>ひょっとして、一行単位に読めて、保存できるということでしょうか???
そういうことだと思います。
適切な表現が出来ず、申し訳ございません。
引き続き、アドバイスの方宜しくお願い致します。
ちなみにソースに目を通してもらえるとうれしいです。
void CMituhiko1Dlg::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
CString buffer, openfile = ";
char crlf[] = \x0d\x0a;
CFileDialog myDLG(TRUE,txt,NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
TXTファイル(*.txt)|*.txt|全て(*.*)|*.*||);
if(myDLG.DoModal() == IDOK){
CStdioFile fin(myDLG.GetPathName(), CFile::modeRead);
while(fin.ReadString(buffer) != NULL){
openfile = openfile + buffer + crlf;
}
m_edit1.SetWindowText(openfile);
}
}
void CMituhiko1Dlg::OnButton3()
{
CString MyGetText;
// まだ一度も保存していない時は必ず名前を付けて保存
if(MyFilePath=="){
CFileDialog myDLG(FALSE, html, 新規ページ,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
HTMLファイル(*.html *htm)|*.html; *htm|全て(*.*)|*.*||);
if(myDLG.DoModal()==IDOK){
CStdioFile fout(myDLG.GetPathName
(),CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
m_edit1.GetWindowText(MyGetText);
fout.WriteString(MyGetText);
MyFilePath = myDLG.GetPathName();
}
// 保存した事がある時は上書き保存するかの確認
}else{
int i = MessageBox(MyFilePath + \nに上書きしますか?, 保存
確認, MB_YESNO );
// 上書き保存
if(i==IDYES){
CStdioFile fout(MyFilePath,
CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
m_edit1.GetWindowText(MyGetText);
fout.WriteString(MyGetText);
// 名前を付けて保存
}else{
CFileDialog myDLG(FALSE,html, 新規ページ,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
HTMLファイル(*.html *htm)|*.html; *htm|全て(*.*)
|*.*||);
if(myDLG.DoModal()==IDOK){
CStdioFile fout(myDLG.GetPathName
(),CFile::modeCreate
|CFile::modeWrite|CFile::typeBinary);
m_edit1.GetWindowText(MyGetText);
fout.WriteString(MyGetText);
MyFilePath = myDLG.GetPathName();
}
}
}
}
島さん
レスありがとうございます。
引き続き、助言宜しくお願いします。
> ちなみにソースに目を通してもらえるとうれしいです。
…これをどうせよと?
何らかのコメントを期待しているなら:
もっと綺麗(エレガント)に書き直しましょう
タブに注意して書き直してみました。
これでも見難いのは百も承知ですが、
まだ若輩者でございますので、何卒宜しくお願いします。
void CMituhiko1Dlg::OnButton1()
{
CString buffer, openfile = ";
char crlf[] = \x0d\x0a;
CFileDialog myDLG(TRUE,txt,NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,TXT
ファイル(*.txt)|*.txt|全て(*.*)|*.*||);
if(myDLG.DoModal() == IDOK){
CStdioFile fin(myDLG.GetPathName(), CFile::modeRead);
while(fin.ReadString(buffer) != NULL){
openfile = openfile + buffer + crlf;
}
m_edit1.SetWindowText(openfile);
}
}
void CMituhiko1Dlg::OnButton3()
{
CString MyGetText;
if(MyFilePath=="){
CFileDialog myDLG(FALSE, html, 新規ページ,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, HTMLファイル(*.html *htm)|*.html; *htm|
全て(*.*)|*.*||);
if(myDLG.DoModal()==IDOK){
CStdioFile fout(myDLG.GetPathName
(),CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
m_edit1.GetWindowText(MyGetText);
fout.WriteString(MyGetText);
MyFilePath = myDLG.GetPathName();
}
}else{
int i = MessageBox(MyFilePath + \nに上書きしますか?, 保存確認,
MB_YESNO );
if(i==IDYES){
CStdioFile fout(MyFilePath,
CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);m_edit1.GetWindowText
(MyGetText);
fout.WriteString(MyGetText);
}else{
CFileDialog myDLG(FALSE,html, 新規ペー
ジ,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,HTMLファイル(*.html *htm)|*.html;
*htm|全て(*.*)|*.*||);
if(myDLG.DoModal()==IDOK){
CStdioFile fout(myDLG.GetPathName
(),CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
m_edit1.GetWindowText(MyGetText);
fout.WriteString(MyGetText);
MyFilePath = myDLG.GetPathName();
}
}
}
}
いや、見易いとか見難いとかいうことじゃなく、
同様の'言い回し'が何度も出てくるのがね。
MFCを使っていて、テキストをエディットに表示させていて、
それを取得して、保存しているようですので、
ファイル読み込み時に CStringArray に Add したらどうでしょうか?
何番目を削除っていう場合は RemoveAt を使うとか。
ただし、消した後、後ろが詰まってくるので注意が必要です。
(3番目を消すと消す前に4番目だったものが3番目になります。)
データをエディットに表示したり、ファイルに保存する際に
ちょっと手間がかかりますが・・・。
参考になるでしょうか?
YOUさん
ありがとうございます。
早速やってみたいと思います。
ほんとにありがとうございます。
CStringにファイル内容を一気に読み込んでいますので、まず配列に読み込むのをお勧めしま
す。
そうすれば何万行あろうが、抜き出す処理は1行単位。それを行数ループするだけです。
>CSVデータを内部でどのように保持しているか、は
>超初心者なので私にはわかりません。
このソースはmituhikoさんが書いたものではないのですか?
ああ、すでに書き込みが(ToT)
ひろぴーさん
レスありがとうございます。
察しのとおり、このソースはインターネットにあったものを
少し変えただけです。
一行単位で配列に読み込めばいいんですね!
わかりました。やってみます。
ありがとうございました。