将字符串拆分为字符串列表

时间:2017-04-25 09:18:17

标签: c# string

我有一个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.
    }
}

3 个答案:

答案 0 :(得分:0)

您可以使用SkipTake 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);