none
Split関数について RRS feed

  • 質問

  • string  swk1,  swk2

    string[]  sdata;

    swk1   =  "丸中太郎     15,000円";

    sdata  =  swk1.Split(  ','  );

    swk2  =  "";

    for  (  int  i  =  0;  i  <  sdata.Length;  i++  )

    {

      swk2  =  swk2  +  '['  +  sdata[ i ]  +  ']';

    }

    MessageBox.Show(  swk2 );

    [丸中太郎     15][000円]

    と表示されます。カンマで区切れと私が指定しているのでしかたないのでしょうけど。

    CSVの場合、ダブルクォーテーションで囲めば1項目になるのでは、ないのでしょうか?

    [丸中太郎     15,000円]

    と表示させる方法を どなたか 教えてください。

     

    2007年3月5日 2:58

回答

  • CSVファイルを読み込むには?[2.0のみ、C#、VB]

    TextFieldParserのコンストラクタはファイル名の他にstreamやTextReaderでもOKなので、今回の場合にも使えるかと。

    2007年3月5日 5:06
  • お返事ありがとうございます。

    ただし、これ かなり 遅いですね。

     

    商品マスター(250,000件)で 試してみたのですが、処理が進んでいないような状況でしたので途中でやめました。

    Split を使用した場合は、4秒くらいで 読み込み終了しますのでせめて同等の処理ができないと・・・。

     

    Split を もう少し よく見て 考えてみます。

     

    2007年3月5日 7:24
  • Split???????????????????512???????????

    C++6.0????????????? Split??????????  

    aaa,"bb  150,000,000",bbb

    ?

    [aaa]["bb   150,000,000"][bbb]

            private string[] m_sItem = new string[ 512 ];

            public int UsParser( string s )
            {
                //throw new System.NotImplementedException();
               
                string[]  sitem;
               
                string    sdata,  sst,  sen;
               
                int       i,  ia,  iitem,  icount,  ilen,  ist,  ien;
               
                iitem  =  0;
               
                if  (  s  ==  null  ||  s  ==  ""  )
                {
                    return  iitem;
                   
                }
               
                sitem   =  s.Split(  ','  );
               
                icount  =  sitem.Length;
               
                if  (  icount  >=  512  )
                {
                    MessageBox.Show(  "?? 512 ????"  );
                   
                    return  -1;
                   
                }
               
                for  (  i  =  0;  i  <  512;  i++  )
                {
                    m_sItem[ i ]  =  "";
                   
                }
               
                i     =  0;
               
                ia    =  0;
               
                ist   =  0;
               
                ien   =  0;
               
                while(  true  )
                {
                    if  (  i  >=  icount  )
                    {               
                        break;
                       
                    }
                   
                    sdata  =  sitem[ i ];
                   
                    i++;
                   
                    ilen   =  sdata.Length  -  1;
                   
                    sst    =  sdata.Substring(  0,  1  );
                   
                    sen    =  sdata.Substring(  ilen,  1  );
                   
                    if  (  sst  ==  "\x22"  &&  sen  !=  "\x22"  )  //  ????   "
                    {
                        ist  =  1;
                   
                    }
                   
                    if  (  sst  !=  "\x22"  &&  sen  ==  "\x22"  )  // ??? "
                    {
                        ien  =  1;
                       
                    }
                   
                    if  (  ist  >  0  &&  ien  ==  0  )
                    {
                        m_sItem[ ia ]  =  m_sItem[ ia ]  +  sdata  +  ',';
                       
                        continue;
                       
                    }
                   
                    if  (  ien  >  0  )
                    {
                        m_sItem[ ia ]  =  m_sItem[ ia ]  +  sdata;
                       
                        ia++;
                       
                        ist  =  0;
                       
                        ien  =  0;
                       
                        continue;
                       
                    }
                   
                    m_sItem[ ia ]  =  sdata;
                   
                    ia++;
               
                }  //  while(  true  )
               
                return  ia;
               
            }

     

    ??????????? 8?????

     

     

    2007年3月7日 2:04
  • 文字化けしているみたいなので、もう一回書きます。

    せっかく、Splitがカンマで分けてくれるので、利用してみました。

    string s に 分解したい文字列を入れたら、件数が 返ってきます。要素はm_sItem[ i ]に入ります。

    s = aaa,"丸中太郎   150,000,000円",bbb

    で 件数 3 、m_sItem[ 1 ]  =  "丸中太郎  150,000,000円"; となります。

            public int UsParser( string s )
            {
                //throw new System.NotImplementedException();
               
                string[]  sitem;
               
                string    sdata,  sst,  sen;
               
                int       i,  ia,  iitem,  icount,  ilen,  ist,  ien;
               
                iitem  =  0;
               
                if  (  s  ==  null  ||  s  ==  ""  )
                {
                    return  iitem;
                   
                }
               
                sitem   =  s.Split(  ','  );
               
                icount  =  sitem.Length;
               
                if  (  icount  >=  512  )
                {
                    MessageBox.Show(  "件数 512 オーバー"  );
                   
                    return  -1;
                   
                }
               
                for  (  i  =  0;  i  <  512;  i++  )
                {
                    m_sItem[ i ]  =  "";
                   
                }
               
                i     =  0;
               
                ia    =  0;
               
                ist   =  0;
               
                ien   =  0;
               
                while(  true  )
                {
                    if  (  i  >=  icount  )
                    {               
                        break;
                       
                    }
                   
                    sdata  =  sitem[ i ];
                   
                    i++;
                   
                    ilen   =  sdata.Length  -  1;
                   
                    sst    =  sdata.Substring(  0,  1  );
                   
                    sen    =  sdata.Substring(  ilen,  1  );
                   
                    if  (  sst  ==  "\x22"  &&  sen  !=  "\x22"  )  //  開始  が "
                    {
                        ist  =  1;
                   
                    }
                   
                    if  (  sst  !=  "\x22"  &&  sen  ==  "\x22"  )  // 終了 が "
                    {
                        ien  =  1;
                       
                    }
                   
                    if  (  ist  >  0  &&  ien  ==  0  )
                    {
                        m_sItem[ ia ]  =  m_sItem[ ia ]  +  sdata  +  ',';
                       
                        continue;
                       
                    }
                   
                    if  (  ien  >  0  )
                    {
                        m_sItem[ ia ]  =  m_sItem[ ia ]  +  sdata;
                       
                        ia++;
                       
                        ist  =  0;
                       
                        ien  =  0;
                       
                        continue;
                       
                    }
                   
                    m_sItem[ ia ]  =  sdata;
                   
                    ia++;
               
                }  //  while(  true  )
               
                return  ia;
               
            }

    2007年3月10日 1:51

すべての返信

  • CSVファイルを読み込むには?[2.0のみ、C#、VB]

    TextFieldParserのコンストラクタはファイル名の他にstreamやTextReaderでもOKなので、今回の場合にも使えるかと。

    2007年3月5日 5:06
  • お返事ありがとうございます。

    ただし、これ かなり 遅いですね。

     

    商品マスター(250,000件)で 試してみたのですが、処理が進んでいないような状況でしたので途中でやめました。

    Split を使用した場合は、4秒くらいで 読み込み終了しますのでせめて同等の処理ができないと・・・。

     

    Split を もう少し よく見て 考えてみます。

     

    2007年3月5日 7:24
  • Splitは単に指定された文字で区切るだけなので、"の中は無視するようにするような
    処理はできないでしょう。

    ですので、前述のものを使うか、自作するかどちらかしかないでしょう。
    自作でもそんなに難しいものではないでしょうね。
    2007年3月5日 7:43
  • 自作でもそんなに難しいものではないでしょうね。

    RFC あるいは Excel 形式を完全にサポートしようと思うと色々考慮する点も多くて意外に複雑になりますけどねー。

    JetOLE プロバイダを利用して、DataReader や DataAdapter を使って読み出すと言う手もアリかな。

    2007年3月5日 8:27
  • Split???????????????????512???????????

    C++6.0????????????? Split??????????  

    aaa,"bb  150,000,000",bbb

    ?

    [aaa]["bb   150,000,000"][bbb]

            private string[] m_sItem = new string[ 512 ];

            public int UsParser( string s )
            {
                //throw new System.NotImplementedException();
               
                string[]  sitem;
               
                string    sdata,  sst,  sen;
               
                int       i,  ia,  iitem,  icount,  ilen,  ist,  ien;
               
                iitem  =  0;
               
                if  (  s  ==  null  ||  s  ==  ""  )
                {
                    return  iitem;
                   
                }
               
                sitem   =  s.Split(  ','  );
               
                icount  =  sitem.Length;
               
                if  (  icount  >=  512  )
                {
                    MessageBox.Show(  "?? 512 ????"  );
                   
                    return  -1;
                   
                }
               
                for  (  i  =  0;  i  <  512;  i++  )
                {
                    m_sItem[ i ]  =  "";
                   
                }
               
                i     =  0;
               
                ia    =  0;
               
                ist   =  0;
               
                ien   =  0;
               
                while(  true  )
                {
                    if  (  i  >=  icount  )
                    {               
                        break;
                       
                    }
                   
                    sdata  =  sitem[ i ];
                   
                    i++;
                   
                    ilen   =  sdata.Length  -  1;
                   
                    sst    =  sdata.Substring(  0,  1  );
                   
                    sen    =  sdata.Substring(  ilen,  1  );
                   
                    if  (  sst  ==  "\x22"  &&  sen  !=  "\x22"  )  //  ????   "
                    {
                        ist  =  1;
                   
                    }
                   
                    if  (  sst  !=  "\x22"  &&  sen  ==  "\x22"  )  // ??? "
                    {
                        ien  =  1;
                       
                    }
                   
                    if  (  ist  >  0  &&  ien  ==  0  )
                    {
                        m_sItem[ ia ]  =  m_sItem[ ia ]  +  sdata  +  ',';
                       
                        continue;
                       
                    }
                   
                    if  (  ien  >  0  )
                    {
                        m_sItem[ ia ]  =  m_sItem[ ia ]  +  sdata;
                       
                        ia++;
                       
                        ist  =  0;
                       
                        ien  =  0;
                       
                        continue;
                       
                    }
                   
                    m_sItem[ ia ]  =  sdata;
                   
                    ia++;
               
                }  //  while(  true  )
               
                return  ia;
               
            }

     

    ??????????? 8?????

     

     

    2007年3月7日 2:04
  • 文字化けしているみたいなので、もう一回書きます。

    せっかく、Splitがカンマで分けてくれるので、利用してみました。

    string s に 分解したい文字列を入れたら、件数が 返ってきます。要素はm_sItem[ i ]に入ります。

    s = aaa,"丸中太郎   150,000,000円",bbb

    で 件数 3 、m_sItem[ 1 ]  =  "丸中太郎  150,000,000円"; となります。

            public int UsParser( string s )
            {
                //throw new System.NotImplementedException();
               
                string[]  sitem;
               
                string    sdata,  sst,  sen;
               
                int       i,  ia,  iitem,  icount,  ilen,  ist,  ien;
               
                iitem  =  0;
               
                if  (  s  ==  null  ||  s  ==  ""  )
                {
                    return  iitem;
                   
                }
               
                sitem   =  s.Split(  ','  );
               
                icount  =  sitem.Length;
               
                if  (  icount  >=  512  )
                {
                    MessageBox.Show(  "件数 512 オーバー"  );
                   
                    return  -1;
                   
                }
               
                for  (  i  =  0;  i  <  512;  i++  )
                {
                    m_sItem[ i ]  =  "";
                   
                }
               
                i     =  0;
               
                ia    =  0;
               
                ist   =  0;
               
                ien   =  0;
               
                while(  true  )
                {
                    if  (  i  >=  icount  )
                    {               
                        break;
                       
                    }
                   
                    sdata  =  sitem[ i ];
                   
                    i++;
                   
                    ilen   =  sdata.Length  -  1;
                   
                    sst    =  sdata.Substring(  0,  1  );
                   
                    sen    =  sdata.Substring(  ilen,  1  );
                   
                    if  (  sst  ==  "\x22"  &&  sen  !=  "\x22"  )  //  開始  が "
                    {
                        ist  =  1;
                   
                    }
                   
                    if  (  sst  !=  "\x22"  &&  sen  ==  "\x22"  )  // 終了 が "
                    {
                        ien  =  1;
                       
                    }
                   
                    if  (  ist  >  0  &&  ien  ==  0  )
                    {
                        m_sItem[ ia ]  =  m_sItem[ ia ]  +  sdata  +  ',';
                       
                        continue;
                       
                    }
                   
                    if  (  ien  >  0  )
                    {
                        m_sItem[ ia ]  =  m_sItem[ ia ]  +  sdata;
                       
                        ia++;
                       
                        ist  =  0;
                       
                        ien  =  0;
                       
                        continue;
                       
                    }
                   
                    m_sItem[ ia ]  =  sdata;
                   
                    ia++;
               
                }  //  while(  true  )
               
                return  ia;
               
            }

    2007年3月10日 1:51