@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

CSVファイルの作成について

投稿者投稿内容
つる
ベテラン
会議室デビュー日: 2004/06/02
投稿数: 81
投稿日時: 2004-07-21 13:58
お世話になりまくってます。

あ,000,0 というカンマ区切りのCSVがあります。
これをエクセルで読み込むと、あ 0 0 となりますよね。
"あ","000",0とすれば、あ 000 0 と表示されるようになると思います。
で、ドットネットでは、これをどのように行うのか検討つきません。
vb6では、以下のコードで実現できていました。
Dim FileNum%
Dim a As String, b As String, c As Long
a = "あ" : b = "000" : c = 0
FileNum% = FreeFile
Open "d:\test.csv" For Output As FileNum%
Write #FileNum%, a, b, c
Close FileNum%

ドットネットで、
sw = New StreamWriter(SFD1.FileName, False, System.Text.Encoding.GetEncoding("Shift_JIS"))
sw.Write(""" & a & """ & ",")
sw.Write(""" & b & """ & ",")
sw.Write(c & ",")
sw.Write(vbCrLf)
や、
strSw = strSw & """ & a & """ & "," & """ & b & """ & "," & c
sw.WriteLine(strSw)
などと、色々とやってみましたが、駄目でした。
streamWriterのwritelineやwriteで実現できるのでしょうか?
どうかご教授ください。よろしくお願いします。
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-07-21 14:14
引用:

コード:
sw.Write(""" & a & """ & ",")
sw.Write(""" & b & """ & ",")




なら
コード:
sw.Write("""" & a & """" & ",")
sw.Write("""" & b & """" & ",")


引用:

コード:
strSw = strSw & """ & a & """ & "," & """ & b & """ & "," & c




なら
コード:
strSw = strSw & """" & a & """" & "," & """" & b & """" & "," & c


です。文字列中のダブルコーテーションは、VB.NETでもVB6でも「""」と2つ重ねないと……。


それと、本筋とは関係ありませんが……。
引用:

あ,000,0 というカンマ区切りのCSVがあります。
これをエクセルで読み込むと、あ 0 0 となりますよね。
"あ","000",0とすれば、あ 000 0 と表示されるようになると思います。


「"あ","000",0」もExcelで開けば「あ 0 0」となります。
soluna
ベテラン
会議室デビュー日: 2004/06/15
投稿数: 59
投稿日時: 2004-07-21 14:16
答えでなくてごめん。
その前の認識に問題があるので一言。

[quote]つるさんの書き込み (2004-07-21 13:58) より:

あ,000,0 というカンマ区切りのCSVがあります。
これをエクセルで読み込むと、あ 0 0 となりますよね。
"あ","000",0とすれば、あ 000 0 と表示されるようになると思います。
[quote]
実際にやってみれば分かりますが、なりません

ExcelでCSVファイルを読み込むときの困った問題の一つです。
後、細かいことですが、全角と半角はちゃんと意識して下さいね。
つる
ベテラン
会議室デビュー日: 2004/06/02
投稿数: 81
投稿日時: 2004-07-21 14:31
すいません。ありがとうございます。
ならないですね。認識に問題ありです。
過去になった記憶があった為、確認もせずに書いてしまいました。
なんか別のアクションをしてたのかも・・・恥ずかしい限りです。

ぢゃん♪さんありがとうございます。できました。
しかも、「色々とやってみた・・」と言っておきながら、こんなに簡単な事を試してなかった。
VB6でも、この書き方で出力したことも過去にはあったはずなんです。(私の中で・・・)
本当にすいませんでした。以後、気をつけます。

今後ともよろしくお願いします。
あみゅせる
常連さん
会議室デビュー日: 2004/07/08
投稿数: 33
お住まい・勤務地: 神奈川県
投稿日時: 2004-07-21 14:43
こんにちは。

手元のバージョンはExcel2002です。

[CSV]
あ,="000",0
[/CSV]

用途によっては完全ではないですが、
少なくとも表示上は達成します。

_________________
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-07-21 15:43
あ,="000",0
表計算式(カンマを含まない)なのですね。

CSVでの数値の扱いはOffice(数値パースして最簡約な形)
とCOBOL方面(桁数や小数点の保存)
の違いがあるので神経を使います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-21 17:08
書き出しなら。。。

項目を走査し、"を""に置き換える
項目全体を"で囲む
項目と項目の区切りを,にして吐き出す


読み込みはやっかいで、

while (ファイルの終わりでない)
 1文字読み込む
 if 読み込んだ文字が" then
  1文字読み込む
  if 次の文字も" then
   項目 += "
  else
   1文字もどす
   文字列フラグを反転
  end if
 else if (読み込んだ文字が,または改行)かつ文字列フラグがfalse then
  項目をリストに追加
  項目をクリア
 else
  項目 += 読み込んだ文字
 end if
end while
if 項目がクリアでなければ then
 項目をリストに追加
end if


こんな感じだったかな?
読み込んだものを数字として扱うか、文字列として扱うかは、読み込んだアプリケーション特有の処理なので、ここでは考えていません。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-07-22 06:30
諸農です。

ずいぶん前に作ったCSVを扱うクラスです。
C#で記述していますが参考になるかもしれません。

コード:
using System;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Specialized;


namespace CSVClass
{
    public interface ICsv : IList
    {
        char Quoted
        {
            get;
            set;
        }
        
        char Delimiter
        {
            get;
            set;
        }

        string CommaStr
        {
            get;
            set;
        }
    }

    public class CommaString : StringCollection, ICsv
    {
        protected char _q = '"';
        protected char _d = ',';

        public string CommaStr
        {
            get {return getCommaStr();}
            set {setCommaStr(value);}
        }

        public char Quoted
        {
            get {return _q;}
            set {_q = value;}
        }
        public char Delimiter
        {
            get {return _d;}
            set {_d = value;}
        }
        
        new public string this[int index]
        {
            get {return base[index];}
            set {base[index] = value;}
        }

        private string getCommaStr()
        {
            StringBuilder sb = new StringBuilder();
            foreach(string s in this)
            {
                sb.Append(_q);
                sb.Append(s);
                sb.Append(_q);
                sb.Append(_d);
            }
            return sb.Remove(sb.Length-1,1).ToString();
        }

        private void setCommaStr(string ACommaStr)
        {
            this.Clear();
            if (ACommaStr.Length == 0)return;
            StringBuilder sb = new StringBuilder(ACommaStr);
            int i = 0;
            string s = "";
            while (true) 
            {
                if (i == sb.Length)
                {
                    s = sb.ToString();
                    base.Add(s);
                    break;
                }
                if (sb[i] == _d)
                {
                    if (i == 0) s = "";
                    else
                    {
                        if (sb[0] == _q)
                        {
                            if (sb[i-1] == _q)
                            {
                                s = sb.ToString().Substring(1,i-2);
                            }
                            else
                            {
                                i++;
                                continue;
                            }
                        } 
                        else s = sb.ToString().Substring(0,i);
                    }
                    sb.Remove(0,i+1);
                    base.Add(s);
                    i = 0;
                } 
                else i++;
            }
        }
    }

    class CommaStrEnumerator: IEnumerator
    {
        int _pos;
        StringCollection list = null;
        public CommaStrEnumerator(StringCollection AList)
        {
            list = AList;
            this.Reset();
        }

        public void Reset()
        {
            _pos = -1;
        }

        public object Current
        {
            get
            {
                ICsv cs = new CommaString();
                cs.CommaStr = list[_pos];
                return cs;
            }
        }

        public bool MoveNext()
        {
            if (_pos >= list.Count-1) return false;
            _pos++;
            return true;
        }
    }

    public class CSV : CommaString, IEnumerable
    {
        new public IEnumerator GetEnumerator()
        {
            return new CommaStrEnumerator(this);
        }

        new public ICsv this[int Row]
        {
            get 
            {
                CommaString cs = new CommaString();
                cs.Delimiter = _d;
                cs.Quoted = _q;
                cs.CommaStr = base[Row];
                return cs;
            }
            set
            {
                base[Row] = value.CommaStr;
            }
        }

        public string this[int Row,int Col]
        {
            get
            {
                return getCommaField(base[Row],Col);
            }
            set
            {
                base[Row] = setCommaField(base[Row],value,Col);
            }

        }

        public CSV():base()
        {
        }
        
        public void LoadFile(string AFileName)
        {
            this.LoadFile(AFileName,Encoding.Default);
        }

        public void LoadFile(string AFileName,Encoding AEncoding)
        {
            using (FileStream fs = new FileStream(AFileName,FileMode.Open))
            {
                using (StreamReader sr = new StreamReader(fs,AEncoding)) 
                {
                    string str;
                    while ((str = sr.ReadLine()) != null) 
                    {
                        base.Add(str);
                    }
                }
            }
        }

        public void SaveFile(string AFileName)
        {
            this.SaveFile(AFileName,Encoding.Default);
        }

        public void SaveFile(string AFileName,Encoding AEncoding)
        {
            using (FileStream fs = new FileStream(AFileName,FileMode.Create))
            {
                using (StreamWriter sw = new StreamWriter(fs,AEncoding)) 
                {
                    foreach(string str in this)
                    {
                        sw.WriteLine(str);    
                    }
                }
            }
        }

        public int AddField(int Row,string value)
        {
            ICsv c = new CommaString();
            c.CommaStr = base[Row];
            int ret = c.Add(value);
            base[Row] = c.CommaStr;
            return ret;
        }

        private string getCommaField(string ACommaStr,int Col)
        {
            ICsv c = new CommaString();
            c.Delimiter = _d;
            c.Quoted = _q;
            c.CommaStr = ACommaStr;
            return (string)c[Col];
        }
        private string setCommaField(string ACommaStr,string AValue,int Col)
        {
            ICsv c = new CommaString();
            c.Delimiter = _d;
            c.Quoted = _q;
            c.CommaStr = ACommaStr;
            if (c.Count > Col)
            {
                c[Col] = AValue;
                return c.CommaStr;
            }
            else
            {
                throw new Exception("配列範囲外");
            }
        }

    }

}




1行のカンマ文字列を作るのでしたらCommaStringクラスで
大丈夫だと思います。このクラスはStringCollectionを継
承しているので、カンマで括りたい項目をAdd()で追加していき、
最後にCommaStrプロパティで取り出せばカンマ文字列のできあがりです。
逆にカンマ文字列のアイテムにアクセスしたいのであれば、
CommaStrプロパティにカンマ文字列をセットした後に、
インデクサで各要素にアクセスすればフィールドが取り出せます。
CSVデータを扱う場合は、CSVクラスを使います。
このクラスはCSVデータを2次元データとして扱います。
ファイルの読み込みにはLoadFile、書き出しにはSaveFileを使います。
項目へのアクセスにはRow(行位置)Col(カラム位置)で行います。

このクラスは、DelphiのVCLのTStringListを組み合わせた考えを模倣
して作ったので、VCLを使っていた人には理解しやすいかもしれません(^^;

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/

スキルアップ/キャリアアップ(JOB@IT)