数字和字母之间的空格分列,应该能实现,你鼓捣一下吧。
不好实现,因为在column A 中看不出任何规律。
不需要规律,就是去掉前面的数字的部分,留下后面字母的部分。
当然前面也有字母的部分,但是只要能实现分列,那个就好解决了。
字母和数字间的空格分列肯定可以实现,只是我们水平还不够高。
不是高手,不过看你的描述可以这样做
先以%为分隔符分成A,B列
再用left(A,search(" ",A,len(A)-5)-1)把最后一个空格后的字符扔掉
再用right(A,len(a)-search("clay -",A,1)+1)把关键字前的字符扔掉
如果就几个关键字,那么直接手动刷几次就搞定了。
按你的说法,第14列B就应该是N/A啊
个人觉得楼主既然想用公式解决这个问题,肯定不止这几行。一般只有column a的内容有一定规律可循,才达到事半功倍的效果。正是因为用search的时候,想取到中间内容的时候,不管是通过哪种途径都看不到共同的规律可循,才觉得不好写。但我观察这几行内容发现如果能实现search “点数字空格字母"这个功能,就可以写公式了。
不懂楼主这个表里a列是些什么,是从哪个文本文档里导入过来的数据么?
非得用公式完成吗?
如果导入数据前的格式工整,可以在从文本文档转为excel的时候实现正确分列.
多谢多谢!其实现在我打算用公式的原因也在于我觉得其实还是有一点规律可以利用,但年纪大了,逻辑思维混乱,搞不清楚前后的关系。。。
我觉得的规律大概是这样的,
就是Column B肯定是以CLAY或者SAND或者SILT三个词开头的(虽然后面的内容和内容的长度都是不一样的)(其实还有极少数类似上面第四行那种例外,三个词一个都没有,但是我大概看了一下,手动修改的工作量不是很大。。。就决定忽略掉第四行这种可能,先处理1到3行和第5行);
右边都有一个%可以作为MID函数的被减数(即Search("%",A11,1),而之前的内容基本都没有%,也就是说右边那个%是唯一的)。我其实想取到右边第二个空格前面一位,但是由于右边字符数的不确定,我打算先以%为界,取出来大部分内容后再处理空格和%之间的内容;
接下来就是在我的MID函数中,我要用到三个不同的Search()内容,而Mid函数本身就有三个参数,其中两个都是不确定的。。。所以就是大概下面这个样子。。
Mid(A1, Search("CLAY",A1,1),Search("%",A1,1)-3-Search("CLAY",A1,1))
Mid(A1, Search("SAND",A1,1),Search("%",A1,1)-3-Search("SAND",A1,1))
Mid(A1, Search("SILT",A1,1),Search("%",A1,1)-3-Search("SILT",A1,1))
这样三种可能的叠加,用ISERROR函数?我现在混乱的就是ISERROR跟MID的函数是什么逻辑关系?哪个在外面哪个在里面?。。。。。。。。。
烦请指点,谢谢!!
一定要用mid/iserror的话,
用一个嵌套if搜索3个关键词“CLAY -”等,搜到就返回起始位置,否则返回一个-1(自己可指定)让公式出错。
return=if(iserror(sch"关键词1”),if(iserror(sch"关键词2”),if(iserror(sch"关键词3”), -1,sch"关键词3”),sch"关键词2”),sch"关键词1”)
sch"a"=search("a",A,1)
然后用mid就行了
mid(A,return,sch("%",A,1)-return+1)
最后去最后一个空格后的字符
我的方法比较暴力,既然楼主只关心英文文本,那么选择就简单了:
a)保留英文字符
b) 干掉其它字符
vba好办,循环就行。但是只用excel自带函数的话,就只能硬来了。选a得话,必须hard code 26个英文字母*2,plus 标点符号若干。
选b得话目测只需要过滤掉10个数字以及若干特殊字符。果断选之。。。。
最后一点,根据上面说的,关键字优先级有矛盾之处,好在目测如果关键字大小写敏感的话应该不是问题,果断选择find代替search:前者区分大小写后者不区分。
问题是关键字前也有英文字符,比如dry 咋办?
多个关键字的问题倒是有办法解决:因为“clay -"只有1个。
不是这个意思,而是你必须决定 clay sand silt三个关键字的优先级,但示例数据中三个关键字的出现顺序是矛盾的。
多谢多谢!其实现在我打算用公式的原因也在于我觉得其实还是有一点规律可以利用,但年纪大了,逻辑思维混乱,搞不清楚前后的关系。。。
我觉得的规律大概是这样的,
就是Column B肯定是以CLAY或者SAND或者SILT三个词开头的(虽然后面的内容和内容的长度都是不一样的)(其实还有极少数类似上面第四行那种例外,三个词一个都没有,但是我大概看了一下,手动修改的工作量不是很大。。。就决定忽略掉第四行这种可能,先处理1到3行和第5行);
右边都有一个%可以作为MID函数的被减数(即Search("%",A11,1),而之前的内容基本都没有%,也就是说右边那个%是唯一的)。我其实想取到右边第二个空格前面一位,但是由于右边字符数的不确定,我打算先以%为界,取出来大部分内容后再处理空格和%之间的内容;
接下来就是在我的MID函数中,我要用到三个不同的Search()内容,而Mid函数本身就有三个参数,其中两个都是不确定的。。。所以就是大概下面这个样子。。
Mid(A1, Search("CLAY",A1,1),Search("%",A1,1)-3-Search("CLAY",A1,1))
Mid(A1, Search("SAND",A1,1),Search("%",A1,1)-3-Search("SAND",A1,1))
Mid(A1, Search("SILT",A1,1),Search("%",A1,1)-3-Search("SILT",A1,1))
这样三种可能的叠加,用ISERROR函数?我现在混乱的就是ISERROR跟MID的函数是什么逻辑关系?哪个在外面哪个在里面?。。。。。。。。。
烦请指点,谢谢!!
其实你的方法已经很接近了,关键的问题就是我前面提到的,如果不区分大小写的话三个关键字的出现顺序是矛盾的。
比如第一列是clay > silt (silty)
第三列却是 silt > clay
问题来了,究竟是应该先搜索clay还是silt?
如果区分大小写,且假设关键字一定是大写,然后用find代替search就没有这个问题了。
既然都用到这么复杂的公式了,为什么不用VBA,也不复杂。
估计要用正则表达式才能完成这个功能。
用正则表达式删除掉那几个指定单词之前的所有字符。
或者导出成文本,对文本进行正则表达式替换,然后再导入excel
SILT后的“-”也需要保留,不能当噪音抹了。
我的方法比较暴力,既然楼主只关心英文文本,那么选择就简单了:
a)保留英文字符
b) 干掉其它字符
vba好办,循环就行。但是只用excel自带函数的话,就只能硬来了。选a得话,必须hard code 26个英文字母*2,plus 标点符号若干。
选b得话目测只需要过滤掉10个数字以及若干特殊字符。果断选之。。。。
最后一点,根据上面说的,关键字优先级有矛盾之处,好在目测如果关键字大小写敏感的话应该不是问题,果断选择find代替search:前者区分大小写后者不区分。
解决方案:
第一步,去除噪音数据。
在B列中输入公式:
=TRIM(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"0",""), "1",""), "2",""),"3",""),"4",""),"5",""),"6",""),"7",""),"8",""),"9",""),".",""),">",""),"-",""),"+",""),"%",""),")",""),"(",""),"Apex",""))
第二步,根据关键字位置截取字符
在C列中输入公式:
=MID(B1,IFERROR(IFERROR(IFERROR(FIND("CLAY",B1),FIND("SAND",B1)),FIND("SILT",B1)),1),1000)
搞定!
试下我写的这个,只需要拷贝以下信息就可以了
=IF(ISNUMBER(FIND("CLAY",A1)),"CLAY - silty, soft, low to medium plastic, grey, moist to wet.",IF(ISNUMBER(FIND("SAND",A1)),"SAND - silty, some clay, fine grained, compacted, non-low plastic, brown, moist to saturated ",IF(ISNUMBER(FIND("Dry",A1)),"SILT - some clay, firm low plastic, light grey, damp to moist",IF(ISNUMBER(FIND("Too",A1))," Too deep to be described","N/A")
我自己试了下,应该可以。希望看到更好的办法!但楼主记得要把里面的A1换成A11
try this:
=IF(ISERR( SEARCH("clay - ",A1)), IF(ISERR( SEARCH("sand - ",A1)), IF(ISERR( SEARCH("SILT - ",A1)), "N/A",MID(A1, SEARCH("SILT - ",A1),20)), MID(A1, SEARCH("sand - ",A1),20)),MID(A1, SEARCH("clay - ",A1),20))
20 is the number of characters in MID function, replace it respectively
问题是关键字前也有英文字符,比如dry 咋办?
多个关键字的问题倒是有办法解决:因为“clay -"只有1个。
不是这个意思,而是你必须决定 clay sand silt三个关键字的优先级,但示例数据中三个关键字的出现顺序是矛盾的。
其实你的方法已经很接近了,关键的问题就是我前面提到的,如果不区分大小写的话三个关键字的出现顺序是矛盾的。
比如第一列是clay > silt (silty)
第三列却是 silt > clay
问题来了,究竟是应该先搜索clay还是silt?
如果区分大小写,且假设关键字一定是大写,然后用find代替search就没有这个问题了。
既然都用到这么复杂的公式了,为什么不用VBA,也不复杂。
估计要用正则表达式才能完成这个功能。
用正则表达式删除掉那几个指定单词之前的所有字符。
或者导出成文本,对文本进行正则表达式替换,然后再导入excel
能用vba或者正则式就好,但楼主的要求就是用excel自带函数。
按照你的思路和要求,我稍微做了修改,但是如你所说第四行信息如果不符合你自己手动即可。现在贴如下公式:=IF(ISNUMBER(FIND("CLAY",A1)),MID(A1,FIND("CLAY",A1,1),FIND("%",A1,1)-3-FIND("CLAY",A1,1)),IF(ISNUMBER(FIND("SAND",A1)),MID(A1,FIND("SAND",A1,1),FIND("%",A1,1)-3-FIND("SAND",A1,1)),IF(ISNUMBER(FIND("SILT",A1)),MID(A1,FIND("SILT",A1,1),FIND("%",A1,1)-3-FIND("SILT",A1,1)),IF(ISNUMBER(FIND("Too",A1))," Too deep to be described","N/A"))))多谢多谢!其实现在我打算用公式的原因也在于我觉得其实还是有一点规律可以利用,但年纪大了,逻辑思维混乱,搞不清楚前后的关系。。。
我觉得的规律大概是这样的,
就是Column B肯定是以CLAY或者SAND或者SILT三个词开头的(虽然后面的内容和内容的长度都是不一样的)(其实还有极少数类似上面第四行那种例外,三个词一个都没有,但是我大概看了一下,手动修改的工作量不是很大。。。就决定忽略掉第四行这种可能,先处理1到3行和第5行);
右边都有一个%可以作为MID函数的被减数(即Search("%",A11,1),而之前的内容基本都没有%,也就是说右边那个%是唯一的)。我其实想取到右边第二个空格前面一位,但是由于右边字符数的不确定,我打算先以%为界,取出来大部分内容后再处理空格和%之间的内容;
接下来就是在我的MID函数中,我要用到三个不同的Search()内容,而Mid函数本身就有三个参数,其中两个都是不确定的。。。所以就是大概下面这个样子。。
Mid(A1, Search("CLAY",A1,1),Search("%",A1,1)-3-Search("CLAY",A1,1))
Mid(A1, Search("SAND",A1,1),Search("%",A1,1)-3-Search("SAND",A1,1))
Mid(A1, Search("SILT",A1,1),Search("%",A1,1)-3-Search("SILT",A1,1))
这样三种可能的叠加,用ISERROR函数?我现在混乱的就是ISERROR跟MID的函数是什么逻辑关系?哪个在外面哪个在里面?。。。。。。。。。
烦请指点,谢谢!!
多谢大侠!
但是就是你最后说的这个问题,我觉得很棘手,要提取字符串的长度不是固定的,我现在定义为从%(基本上只有一个,如果有多,我手动修改工作量不会很大)到左侧三个关键词CLAY,SAND,SILT之间字符串的长度,也就是我上面提到的search()-search(),而这里面又存在一个内嵌的iserror关系,也就是三个关键词不知道哪一个会出现,我现在就是被这种嵌套关系给搞晕了。。。
我也分享一下我的过程(这可以不管关键字,只要规律一致):
1)第一步我是把后面的数字去掉,得到前半部分字符串,放到B栏
=MID(A2,1,FIND("@",SUBSTITUTE(A2," ","@",LEN(A2)-LEN(SUBSTITUTE(A2," ",""))-1))-1)
2)在前半部分字符串找到最后一个数字,从它后面开始的字符串就是所求结果,放到C栏
=MID(B2,LOOKUP(9,--MID(B2,ROW(INDIRECT("1:"&LEN(B2))),1),ROW(INDIRECT("1:"&LEN(B2))))+1,999)
由于不太懂Excel公式,于是百度了一下:
先搜索“Excel字符串取最后一个空格”,得到http://www.excelpx.com/thread-288080-1-1.html,看到帖子最后一篇是=MID(A2,FIND("@",SUBSTITUTE(A2," ","@",LEN(A2)-LEN(SUBSTITUTE(A2," ",""))))+1,99)
于是学习了Substitute函数,改造成自己的取倒数第二个空格
再搜索“Excel字符串找最后一个数字”,找到http://club.excelhome.net/thread-606389-1-1.html
这个就可以直接用了。
虽然一知半解,但我总相信靠百度搜索Excel知识,一般还是可以解决问题的。
:)
按照你的思路和要求,我稍微做了修改,但是如你所说第四行信息如果不符合你自己手动即可。现在贴如下公式:=IF(ISNUMBER(FIND("CLAY",A1)),MID(A1,FIND("CLAY",A1,1),FIND("%",A1,1)-3-FIND("CLAY",A1,1)),IF(ISNUMBER(FIND("SAND",A1)),MID(A1,FIND("SAND",A1,1),FIND("%",A1,1)-3-FIND("SAND",A1,1)),IF(ISNUMBER(FIND("SILT",A1)),MID(A1,FIND("SILT",A1,1),FIND("%",A1,1)-3-FIND("SILT",A1,1)),IF(ISNUMBER(FIND("Too",A1))," Too deep to be described","N/A"))))
我也分享一下我的过程(这可以不管关键字,只要规律一致):
1)第一步我是把后面的数字去掉,得到前半部分字符串,放到B栏
=MID(A2,1,FIND("@",SUBSTITUTE(A2," ","@",LEN(A2)-LEN(SUBSTITUTE(A2," ",""))-1))-1)
2)在前半部分字符串找到最后一个数字,从它后面开始的字符串就是所求结果,放到C栏
=MID(B2,LOOKUP(9,--MID(B2,ROW(INDIRECT("1:"&LEN(B2))),1),ROW(INDIRECT("1:"&LEN(B2))))+1,999)
由于不太懂Excel公式,于是百度了一下:
先搜索“Excel字符串取最后一个空格”,得到http://www.excelpx.com/thread-288080-1-1.html,看到帖子最后一篇是=MID(A2,FIND("@",SUBSTITUTE(A2," ","@",LEN(A2)-LEN(SUBSTITUTE(A2," ",""))))+1,99)
于是学习了Substitute函数,改造成自己的取倒数第二个空格
再搜索“Excel字符串找最后一个数字”,找到http://club.excelhome.net/thread-606389-1-1.html
这个就可以直接用了。
虽然一知半解,但我总相信靠百度搜索Excel知识,一般还是可以解决问题的。
:)
当然合并成一个公式也可以,就是嫌长:)
非常感谢!!我开始觉得这里面最麻烦的就是各个关键词之间的逻辑关系,因为先用筛选分别求解当然可以,但是就是很麻烦,且容易有遗漏。组成一个公式就要首先搞清楚它们之间的逻辑关系。
我也是google出来的一些思路,加上这边你们的一些good idea,才算基本解决了这个问题。
不过还是打算有时间学一下VBA。。。发现这个才是治标治本的办法。。。就是不知道这东西有多难学。。。
如果用vba,可以用宏可以解决的。写个程序,先把excel导出,处理后倒入,java .net都可以
直接套用excel 公式,很容易误点击破坏公司
能对楼主有帮助就非常开心了。希望今后多切磋,我也是知道的不多,也是现学现用。前段时间我的manager叫我改一个项目的好多excel里面的title block信息,实在不想一个个打开改,就学习用程序做,很是有意思!非常感谢!!按照你的思路,我稍微改了一下,发现基本上差不多了,你里面唯一有一点问题的就是-3,因为%前面的字符数量不均等,我稍微改了一下如下,
=IF(ISNUMBER(FIND("CLAY",A12)),MID(A12,FIND("CLAY",A12,1),LEN(A12)-FIND("CLAY",A12,1)+1),IF(ISNUMBER(FIND("SAND",A12)),MID(A12,FIND("SAND",A12,1),LEN(A12)-FIND("SAND",A12,1)+1),IF(ISNUMBER(FIND("SILT",A12)),MID(A12,FIND("SILT",A12,1),LEN(A12)-FIND("SILT",A12,1)+1),IF(ISNUMBER(FIND("Too",A12)),MID(A12,FIND("Too",A12,1),LEN(A12)-FIND("Too",A12,1)+1),"N/A"))))
这样的话,我就把所有关键词及之后的内容取了出来,然后再加两列,分别取出最后两列的内容,
=RIGHT(A12,LEN(A12)-FIND("|",SUBSTITUTE(A12," ","|",LEN(A12)-LEN(SUBSTITUTE(A12," ",""))-1))+1)
=LEFT(I12,LEN(J12)-LEN(L12))
这样三列的内容就都出来了。但是还是基于你的公式为前提,提示了我很多。非常感谢!!