C# で SQL クエリを実行しているときに問題が発生しました。文字列の IN CLAUSE に 1000 を超えるエントリが含まれていると、SQL クエリでエラーがスローされます。
文字列を「,」で区切られた 999 個の文字列を含む文字列配列に分割したいと考えています。
また
文字列内で n 番目に出現する「,」を見つける方法を教えてください。
C# で SQL クエリを実行しているときに問題が発生しました。文字列の IN CLAUSE に 1000 を超えるエントリが含まれていると、SQL クエリでエラーがスローされます。
文字列を「,」で区切られた 999 個の文字列を含む文字列配列に分割したいと考えています。
また
文字列内で n 番目に出現する「,」を見つける方法を教えてください。
次のようなユーティリティ コードを使用して、SQL サーバーから文字列を DataSet にプルします。
string strResult = String.Empty;
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.CommandText = strSQL;
strResult = cmd.ExecuteScalar().ToString();
}
SQL Server から返された文字列を取得する
「,」で文字列を分割します
string[] strResultArr = strResult.Split(',');
次に、「、」で区切られたn番目の文字列を取得します(これは、「文字列で「、」のn番目の出現を見つける方法」の意味だと思います。使用
int n = someInt;
string nthEntry = strResultArr[someInt - 1];
これが役立つことを願っています。
正規表現とクラスのIndex
プロパティを使用できます。Match
// Long string of 2000 elements, seperated by ','
var s = String.Join(",", Enumerable.Range(0,2000).Select (e => e.ToString()));
// find all ',' and use '.Index' property to find the position in the string
// to find the first occurence, n has to be 0, etc. etc.
var nth_position = Regex.Matches(s, ",")[n].Index;
必要なサイズの文字列の配列を作成するには、文字列を分割し、LINQ を使用GroupBy
して結果を分割し、結果のグループを結合します。
var result = s.Split(',').Select((x, i) => new {Group = i/1000, Value = x})
.GroupBy(item => item.Group, g => g.Value)
.Select(g => String.Join(",", g));
result
それぞれ 1000 個のコンマ区切り要素を持つ 2 つの文字列が含まれるようになりました。
これはどうですか:
int groupSize = 1000;
string[] parts = s.Split(',');
int numGroups = parts.Length / groupSize + (parts.Length % groupSize != 0 ? 1 : 0);
List<string[]> Groups = new List<string[]>();
for (int i = 0; i < numGroups; i++)
{
Groups.Add(parts.Skip(i * groupSize).Take(groupSize).ToArray());
}
多分このようなもの:
string line = "1,2,3,4";
var splitted = line.Split(new[] {','}).Select((x, i) => new {
Element = x,
Index = i
})
.GroupBy(x => x.Index / 1000)
.Select(x => x.Select(y => y.Element).ToList())
.ToList();
String.Join
この後は、それぞれだけにする必要がありますIList<string>
。
//initial string of 10000 entries divided by commas
string s = string.Join(", ", Enumerable.Range(0, 10000));
//an array of entries, from the original string
var ss = s.Split(',');
//auxiliary index
int index = 0;
//divide into groups by 1000 entries
var words = ss.GroupBy(w =>
{
try
{
return index / 1000;
}
finally
{
++index;
}
})//join groups into "words"
.Select(g => string.Join(",", g));
//print each word
foreach (var word in words)
Console.WriteLine(word);
または、文字列内のインデックスを見つけて、後で部分文字列に分割することもできます。
string s = string.Join(", ", Enumerable.Range(0, 100));
int index = 0;
var indeces =
Enumerable.Range(0, s.Length - 1).Where(i =>
{
if (s[i] == ',')
{
if (index < 9)
++index;
else
{
index = 0;
return true;
}
}
return false;
}).ToList();
Console.WriteLine(s.Substring(0, indeces[0]));
for (int i = 0; i < indeces.Count - 1; i++)
{
Console.WriteLine(s.Substring(indeces[i], indeces[i + 1] - indeces[i]));
}
ただし、エントリを 1 つの文字列に結合する前に作業することができれば、考え直します。IN
そしておそらく、ステートメントに渡すためにその大きなリストを必要とするクエリを作成する必要性を防ぐことができればと思います。
string foo = "a,b,c";
string [] foos = foo.Split(new char [] {','});
foreach(var item in foos)
{
Console.WriteLine(item);
}