有商品时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盒等于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瓶
下面的内容没有了,百度了网上都是将反斜杠(转义字符),我想知道斜杠除了作运算符,在本实例中如何表示?
另求更加方法来解决此问题,谢谢!
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> */
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();
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
为什么只能得到第二个"/"之前的内容?
{
Console.WriteLine(d[i]);
}
写错了,应该是
for (int i = 0; i <d.Length; i++)
我详细你的方法最简单有效的,不能完全理解其意思,我拷贝你代码测试报错,可以贴出完整代码吗?
另外,我使用Microsoft Visual Studio 2005,按照你方式发现不能声明var类型,Regex.Matches(string,string)后不能点出Cast,手工输入后无法点出Select(),new后面直接跟{},中间是否缺少了什么?我是新手希望能告诉我原因,我不喜欢直接抄代码。
首先定义类
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); }