我有一个28000行长的字符串,如下所示:
List<string> sQuerys = new List<string>();
string FullFileQuery = " EXEC spDataCache_INS_XSCDV1P @Company = 'UKC ', @Country = 'AE ', @Trade_Lane = 'ARABIAN GULF/MIDDLE EAST ', @Trade_Region = 'INDIA/PAKISTAN/MIDDLE EAST '
EXEC spDataCache_INS_XSCDV1P @Company = 'UKC ', @Country = 'AL ', @Trade_Lane = 'MEDITERRANEAN ', @Trade_Region = 'EUROPE/MEDITERRANEAN '
EXEC spDataCache_INS_XSCDV1P @Company = 'UKC ', @Country = 'AO ', @Trade_Lane = 'WEST AFRICA ', @Trade_Region = 'AFRICA '
EXEC spDataCache_INS_XSCDV1P @Company = 'UKC ', @Country = 'AR ', @Trade_Lane = 'EAST COAST SOUTH AMERICA ', @Trade_Region = 'LATIN AMERICA '
EXEC spDataCache_INS_XSCDV1P @Company = 'UKC ', @Country = 'AU ', @Trade_Lane = 'AUSTRALIA/NEW ZEALAND ', @Trade_Region = 'FAR EAST AND OCEANIA '"
我想每隔15000行拆分字符串并添加到我的字符串sQuerys
列表中。
因此,28000行将分为15000行和13000行并添加到列表中。我不确定实现这一目标的最快方法。
编辑:
我尝试过的代码但我被困在下面:
if (FullFileQuery.Split('\n').Length > 15000)
{
//28000
int numLines = FullFileQuery.Split('\n').Length;
//LOOP TWICE.
for (int i = 0; i < ((numLines / 15000) + 1); i++)
{
//NEED TO ADD TO sQuerys in here.
}
}
答案 0 :(得分:0)
您可以使用Skip
和Take
Linq方法执行以下操作:
int chunkSize = 15000;
var splitted = FullFileQuery.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
int chunks=splitted.Length/chunkSize; //Get number of chunks
for (int i=0;i<chunks;i++)
{
sQuerys.Add(string.Join(Environment.NewLine,splitted
.Skip(i * chunkSize) //skip the already added lines
.Take(chunkSize))); //take the new lines
}
所以基本上我们首先将所有行分成splitted
。然后我们将分割的数组长度除以我们想要得到多少块的块大小。最后,我们首先使用Skip
循环这些块来“跳转”我们已经添加到先前块的行,然后Take
来获取块。
如果有什么不起作用,请不要尝试评论。
答案 1 :(得分:0)
您可以使用类似
的内容class Program
{
static void Main(string[] args)
{
var input = @"your long multiline string...";
var list = new List<string>();
var lines = input.Split('\n');
var index = 0;
var batchSize = 15000;
while (index < lines.Count())
{
list.Add(string.Join(string.Empty, lines.Skip(index).Take(batchSize)));
index += batchSize;
}
}
}
答案 2 :(得分:0)
此扩展方法会将任何类型的列表批处理为IEnumerable
个批次。
public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source, int batchSize)
{
var batch = new List<T>(batchSize);
foreach (var item in source)
{
batch.Add(item);
if (batch.Count == batchSize)
{
yield return batch;
batch = new List<T>(batchSize);
}
}
if (batch.Any())
{
yield return batch;
}
}
你可以像这样使用它:
var batchesOfLines = allLines.Batch(15000);