有商品时N合1拼成1件
录入人员当时不是很标准(1盒等于10瓶),数据源如下:
20120104:40瓶/20120213-1:30瓶/120601:60瓶/1207011:5盒/120801A:5盒上面是一个字段中的某条记录信息,可以说没有规律也可以说有规律也有些记录是
20120104:40瓶,20120213-1:30瓶,120601:60瓶,1207011:5盒,120801A:5盒
20120213-1:15盒,120601:5盒
20120104:40瓶、20120105:160瓶
其中的标点符不能确定,时常中英文不分。现在问题,我先想把它分离出正常的数据,转换成标准的记量单位(后然为每批发附上有效期方便管理)
先判断string中char为非汉字、数字、字母写入Array,
然后通过String.Split()拆分字符串,可以只能出现
20120104
40瓶
下面的内容没有了,百度了网上都是将反斜杠(转义字符),我想知道斜杠除了作运算符,在本实例中如何表示?
另求更加方法来解决此问题,谢谢!

解决方案 »

  1.   

    不知道是不是你想要的?string tempStr = @"20120104:40瓶/20120213-1:30瓶/120601:60瓶/1207011:5盒/120801A:5盒
    20120104:40瓶,20120213-1:30瓶,120601:60瓶,1207011:5盒,120801A:5盒
    20120213-1:15盒,120601:5盒
    20120104:40瓶、20120105:160瓶";
                string pattern = @"(?i)(\d+[^::]+?)[::]\s*?(\d+)(盒|瓶)";
                var result = Regex.Matches(tempStr, pattern).Cast<Match>().Select(a => new
                {
                    ID=a.Groups[1].Value,
                    Num=a.Groups[3].Value=="盒"?((int.Parse(a.Groups[2].Value)*10)).ToString()+"瓶":a.Groups[2].Value+a.Groups[3].Value
                });
                /*
                 * + [0] { ID = "20120104", Num = "40瓶" } <Anonymous Type>
                    + [1] { ID = "20120213-1", Num = "30瓶" } <Anonymous Type>
                    + [2] { ID = "120601", Num = "60瓶" } <Anonymous Type>
                    + [3] { ID = "1207011", Num = "50瓶" } <Anonymous Type>
                    + [4] { ID = "120801A", Num = "50瓶" } <Anonymous Type>
                    + [5] { ID = "20120104", Num = "40瓶" } <Anonymous Type>
                    + [6] { ID = "20120213-1", Num = "30瓶" } <Anonymous Type>
                    + [7] { ID = "120601", Num = "60瓶" } <Anonymous Type>
                    + [8] { ID = "1207011", Num = "50瓶" } <Anonymous Type>
                    + [9] { ID = "120801A", Num = "50瓶" } <Anonymous Type>
                    + [10] { ID = "20120213-1", Num = "150瓶" } <Anonymous Type>
                    + [11] { ID = "120601", Num = "50瓶" } <Anonymous Type>
                    + [12] { ID = "20120104", Num = "40瓶" } <Anonymous Type>
                    + [13] { ID = "20120105", Num = "160瓶" } <Anonymous Type>             */
      

  2.   

    这个不用正则表达式也可解决,split方法的参数是数组,所以支持多种分隔符:                string st = "20120104:40瓶,20120213-1:30瓶,120601:60瓶,1207011:5盒,120801A:5盒,20120213-1:15盒,120601:5盒,20120104:40瓶、20120105:160瓶";
                    string[] st2 = st.Split(new string[] { "/", ",", ",", "、" }, StringSplitOptions.None);
                    StringBuilder sb = new StringBuilder();
                    foreach (string s in st2)
                    {
                        string[] st3 = s.Split(new string[] { ":", ":" }, StringSplitOptions.None);
                        if (st3.Length == 2 && !String.IsNullOrEmpty(st3[0])
                            && !String.IsNullOrEmpty(st3[1]))
                        {
                            sb.AppendLine(st3[0]);
                            sb.AppendLine(st3[1]);
                        }
                    }
                    string result = sb.ToString();
      

  3.   

    你好,以下是我的测试代码:
                string aa = "20120201-1|20120202-1";
                string bb = "asdflaskfjsa:sdfsd/asdfas:saf/safwefw:xxx";
                string[] s = aa.Split('|');
                string[] d = bb.Split(new char[] { '/', ',', ',', '、' });
                Console.WriteLine(bb);
                for (int i = 0; i < s.Length; i++)
                {
                    Console.WriteLine(s[i]);
                }
                
                for (int i = 0; i < s.Length; i++)
                {
                    Console.WriteLine(d[i]);
                }
                
    处理结果:
    asdflaskfjsa:sdfsd/asdfas:saf/safwefw:xxx
    20120201-1
    20120202-1
    asdflaskfjsa:sdfsd
    asdfas:saf
    为什么只能得到第二个"/"之前的内容?
      

  4.   

      for (int i = 0; i <d.Length; i++)
                {
                    Console.WriteLine(d[i]);
                }
      

  5.   

    for (int i = 0; i < s.Length; i++)
    写错了,应该是
    for (int i = 0; i <d.Length; i++)
      

  6.   


    我详细你的方法最简单有效的,不能完全理解其意思,我拷贝你代码测试报错,可以贴出完整代码吗?
    另外,我使用Microsoft Visual Studio 2005,按照你方式发现不能声明var类型,Regex.Matches(string,string)后不能点出Cast,手工输入后无法点出Select(),new后面直接跟{},中间是否缺少了什么?我是新手希望能告诉我原因,我不喜欢直接抄代码。
      

  7.   

    由于你的.NET框架版本低,不支持Linq,所以
    首先定义类
    public class Product
        {
            private string id;        public string ID
            {
                get { return id; }
                set { id = value; }
            }
            private string num;        public string Num
            {
                get { return num; }
                set { num = value; }
            }
        }然后调用string tempStr = @"20120104:40瓶/20120213-1:30瓶/120601:60瓶/1207011:5盒/120801A:5盒
    20120104:40瓶,20120213-1:30瓶,120601:60瓶,1207011:5盒,120801A:5盒
    20120213-1:15盒,120601:5盒
    20120104:40瓶、20120105:160瓶";
                string pattern = @"(?i)(\d+[^::]+?)[::]\s*?(\d+)(盒|瓶)";            //string tempStr = File.ReadAllText(@"C:\Users\M\Desktop\Test.txt", Encoding.GetEncoding("GB2312"));
                List<Product> product_list = new List<Product>();
                foreach (Match m in Regex.Matches(tempStr, pattern))
                {
                    Product product = new Product();
                    product.ID = m.Groups[1].Value;
                    product.Num=m.Groups[3].Value=="盒"?((int.Parse(m.Groups[2].Value)*10)).ToString()+"瓶":m.Groups[2].Value+m.Groups[3].Value;
                    product_list.Add(product);            }