2011-07-14 6 views
3

私は、タブ区切りのファイルを解析し、別のプログラムにデータを書き込むための自動化プログラムを作成しています。現在のところ、ファイルの各行をタブ単位で分割し、それぞれのコマンドで異なるエントリを使用します。私の問題は、解析しているすべてのデータエントリにフィールドの「X」が必要ですが、空のフィールドが数多くあり、他のタブの直後に続くタブがあることがあります。文字列を tで分割すると連続するタブで問題が発生しますか?

スプリットファイルラインから文字列のリストにアクセスしようとすると、自分自身がかなり頻繁にIndexOutOfRangeExceptionになることがあります。複数のタブでリストが「X」個のフィールドで終わるとは限らないため、この例外がスローされますか?もしそうなら、これを回避する方法はありますか?

[EDIT] HERESにコード:

string[] parts = line.Split('\t'); 
String Organization = parts[0]; 
String SalesRep_FirstName = SalesRep.Split(' ').First(); 
String SalesRep_LastName = SalesRep.Split(' ').Last(); 
String Opportunity = parts[1] == "" ? "" : parts[1]; 
String Type = parts[6] == "" ? comboBox1.SelectedItem.ToString() : parts[6]; 
String CloseMonth = (parts[5].Split('/'))[0] == "" ? "12" : (parts[5].Split('/'))[0]; 
String CloseDay = (parts[5].Split('/'))[1] == "" ? "21" : (parts[5].Split('/'))[1]; 
String CloseYear = (parts[5].Split('/'))[2] == "" ? "2012" : (parts[5].Split('/'))[2]; 
String Stage = (parts[2].Split('-'))[0] == "" ? "1" : (parts[2].Split('-'))[0]; 
String Probability = parts[4] == "" ? "0" : (Math.Round(decimal.Parse(parts[4])/10) * 10).ToString(); 
String Source = parts[7] == "" ? "" : parts[7]; 
String Department = Type; 
String Product = Opportunity; 
String Revenue = parts[3] == "" ? "" : parts[3]; 

理想的には、リストpartsの各インスタンスは、「shouldn 9つのエントリ(そのここで参照されていないのでparts[8]は、冗長である)

答えて

4

を有するであろうStringSplitOptions.RemoveEmptyEntriesを使用している場合を除き、問題はありません。例えば

string text = "a\t\t\tb"; 
string[] bits = text.Split('\t'); 
Console.WriteLine(bits.Length); // 4, of which the middle two are empty 

あなたはが役立つだろう(理想的には短いが完全な形で、)作業ではないコードを投稿することができます。

+0

例外が発生している場所にコードを掲載しました –

+0

@Jordan:そうです、あなたはそこで分割する*ロット*をやっています。例えば、 'parts [5]'は空で、 'CloseYear'が間違っているかもしれません。基本的には、問題はタブで分割されているとは思わない...例外が発生したときに問題が発生しているデータをログに記録しますか? –

+0

並べ替えこれは私の最初のwinformsアプリケーションであり、私は多くのことを学んでいます。私はいくつかの基本的なロギングをやっていますが、私の問題の詳細について多くの洞察を提供することはできません。しかし、私は分割の意味を見ているので、私はそれを見てみよう –

4

次の2つの方法で文字列を分割することができます

string input = "x\t\ty\t\t\tz"; 

char[] separator = new char[] { '\t' }; 

string[] result1 = input.Split(separator, StringSplitOptions.None); 
// result1 == new string[] { "x", "", "y", "", "", "z" } 

string[] result2 = input.Split(separator, StringSplitOptions.RemoveEmptyEntries); 
// result2 == new string[] { "x", "y", "z" } 

あなたがStringSplitOptions.Noneを使用している場合は、結果の配列は常に同じ長さを持つべきである - 各入力は、同じ数が含まれていることを提供しますタブ。

関連する問題