【问题标题】:Split long CSV string into multiple string variables将长 CSV 字符串拆分为多个字符串变量
【发布时间】:2013-09-15 04:36:29
【问题描述】:

我有一个最长 44,119 个字符的长 CSV 字符串。我有一个接受 1 到 6 个参数的 SQL 存储过程,每个 varchar(8000) 这样将长 CSV 分成多个参数并将其传递给存储过程。

我的存储过程运行良好,但如何将长 CSV 分成不同的字符串变量,使它们不超过 8000 个字符的字符串长度?

例如:

string myLongCSV = "1,2,345,5674,234,22,34..." //a long CSV

我不能使用SubString (0, 8000),因为第 8,000 个字符可能会破坏长 CSV 中的数字而不是逗号。

我想用C#编写代码,将长CSV中的所有数字分成不同的字符串变量,使每个变量的长度不超过8000个字符。

【问题讨论】:

  • 到目前为止你尝试过什么?另外,TVP 可能是更好的选择吗?将 CSV 传递给 SQL 通常不是一个好的选择。

标签: c# linq csv


【解决方案1】:

如果可以,请将 SQL 存储过程修改为使用数据类型为 VACHAR(MAX) 的单个参数,因为它最多可存储 2,147,483,647 个字符。

如果不能,请使用String.Split 函数,如下所示:

string[] words = myLongCSV.Split(',');
foreach (string word in words)
{
    // some logic here to construct your parameters and check their length.
}

【讨论】:

  • 我使用 sql 存储的 proc 和 varchar(max) 但是当使用 long 参数执行它时,它曾经在 8000 个字符后切断。
  • 你如何从你的 SP 调用 SP? ADO.NET?实体框架?您可能在代码中使用了错误的参数数据类型。
  • 我刚刚使用 SQL Server 管理工作室的查询编辑器进行了测试,例如 Exec MyStoredProc '1,2,3,...' //long csv 文件。但最终我想从我的 C# 代码中调用它。
  • 确保使用 VARCHAR(MAX) 数据类型。还要检查您的 SSMS 选项。如果您正在执行 SELECT,则返回的结果中有一个默认的截止长度。
【解决方案2】:

试试这个。

这个想法是获取第 8,000 个字符,如果它是一个数字,然后减少索引直到它是 ',',然后你可以这样做 Substring(),像这样:

string s = "123,45636...";      
int index = 7;

while (true)
{
    if (s[index] == ',')
    {
        s = s.Substring(0, index);
        break;
    }
    else
    {
        index--;
    }
}

【讨论】:

  • 好主意,但您可能想使用index = String.LastIndexOf(',', 8000) 来实现它,因此您不需要循环。
  • 最后我在数据库中创建了一个 varchar(Max) 字段,并将整个 44119 个字符作为 CSV 字符串传递。当我以前在存储过程中使用 Split 以逗号分隔 CSV 时,它会在 8000 个字符后截断数据,但使用 charindex 并一一获取数据对我有用。
猜你喜欢
  • 2020-09-12
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 2011-06-14
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多