【问题标题】:splitting the string based on multiple spaces根据多个空格拆分字符串
【发布时间】:2014-09-09 20:26:59
【问题描述】:

我有一个类似下面的字符串

ABC PQR 123  R1234 TREW     

我需要拆分它并将单个值放入数据库中。

数据库表是这样的

Col1   Col2    Col3  Col4  Col5       Col6

 ABC   PQR     123         R1234      TREW

我可以使用 split 函数在空格处进行分割,但有时有多个空格,然后我想在表格中插入一个空格,所以在上面的字符串中,我在 123 和 R1234 之间有两个空格。我需要在 Col4 中插入空格来表示字符串的那部分没有任何内容。可以有两个以上的空格,这意味着 Col4 和 Col5 都可以为空,所以每当有两个空格时,我需要在对应的列中输入空格,如果有一个空格,那么我需要在数据库中输入值.我怎样才能做到这一点。

任何帮助将不胜感激。

【问题讨论】:

  • "ABC PQR 123 R1234 TREW ".Split({" "c}, StringSplitOptions.RemoveEmptyEntries) 怎么样? :msdn.microsoft.com/en-us/library/tabh47cf(v=vs.110).aspx
  • @Bjørn-RogerKringsjå 因为这不会给他一个空的Col4条目
  • @tnw 啊!你是绝对正确的!没有注意到那个空列。
  • @tnw 看起来这个字符串是从基于列的文本文件中读取的。

标签: c# vb.net


【解决方案1】:

所以你有由空格分隔的列,只要值本身不包含空格,这不是问题。你只需要使用String.Split(new[]{' '}, StringSplitOptions.None):

 string[] allFields = str.Split(new[]{' '}, StringSplitOptions.None);

现在string[] 中的每个字符串都是表的列值。如果存在空字符串,则表示该列的值也为空。

所以假设 sql-server:

string[] allFields = "ABC PQR 123  R1234 TREW".Split(new[] { ' ' }, StringSplitOptions.None);
if(allFields.Length >= 6)   // == 6 if more values than columns is exceptional
{
    string sql = @"INSERT INTO table(Col1,Col2,Col3,Col4,Col5,Col6)
                   VALUES(@Col1,@Col2,@Col3,@Col4,@Col5,@Col6)";
    using(var con = new SqlConnection(Properties.Settings.Default.ConnectionString))
    using (var cmd = new SqlCommand(sql, con))
    {
        cmd.Parameters.AddWithValue("@Col1", allFields[0]);
        cmd.Parameters.AddWithValue("@Col2", allFields[1]);
        cmd.Parameters.AddWithValue("@Col3", allFields[2]);
        cmd.Parameters.AddWithValue("@Col4", allFields[3]);
        cmd.Parameters.AddWithValue("@Col5", allFields[4]);
        cmd.Parameters.AddWithValue("@Col6", allFields[5]);
        con.Open();
        int inserted = cmd.ExecuteNonQuery();
    }
}

【讨论】:

  • 我打算让他弄清楚——但这里是我要提供的链接以供参考...msdn.microsoft.com/en-us/library/…msdn.microsoft.com/en-us/library/t97s7bs3(v=vs.110).aspxdotnetperls.com/trim
  • 我也不确定 OP 是否意识到他的字符串在 123 和 R1234 之间有 三个 空格,导致数组 I'我猜他不想要。此外,TREW 之后还有三个。这不会完全得到他想要的。
  • 看看这个小提琴,它演示了我在说什么。这适用于使用他的确切字符串的第 1-4 列,但此解决方案随后分崩离析。 dotnetfiddle.net/eYXkAK
  • @Rufus 因为它明确指出空格意味着该列的空值。
  • @user3862503:那你有问题了。你想如何区分分隔符和值?
【解决方案2】:

我想这可以使用TextFieldParser 类解析。

有一个look at this nice article 也允许指定字段长度。

链接的一部分:

reader.SetFieldWidths(5, 21, 7, -1)

使用它,您也可以处理可变长度字段。

【讨论】:

  • 虽然我也可以推荐该课程并且使用可用的解析器比重新发明轮子更好,但 SetFieldWidths 在这里没有帮助,因为字段没有固定长度。
  • @TimSchmelter,但我想在阅读第一行后我们可以得到字段长度
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多