作为最终表加入的大数据转换工作的一部分,我在Excel中创建自定义排序字段以迁移到GIS,但需要格式化某个字段,排序顺序将按照这种方式运行到真正的网站序列。我正在使用Excel 2010.数据是〜250,000条记录(最终是数百万条记录)。
Problem Field How Excel Sorts It The Needed Sort
585 585 585
979 979 585A
1175 1175 585B
1227A 1227A 585C
585A 585A 979
585B 585B 979Q
585C 585C 979R
979Q 797Q 1175
979R 979R 1227A
B11 B1 B1
B1 B11 B9
B9 B9 B11
B90 B90 B90
同事和我决定通过创建一个临时站点字段来解决这个问题。 以字母开头(将相应的第一个字母更改为大号):
B1 --> 20000001
B11 --> 20000011
G22 --> 70000022
和 以字母结尾(更改带小数的结束字母以保留排序顺序):
587A --> 587.01
587M --> 587.13
如果它以字母开头并以字母结尾,请保持整个字符串不变。 我有两个新字段,“StartsWithLetter”和“EndsWithLetter”,每个字段都有一个True或False语句来显示哪些字段有字母和哪里。
=SUM(COUNTIF(A4,{"a*","b*","c*","d*","e*","f*","g*","h*","i*","j*","k*","l*","m*","n*","o*","p*","q*","r*","s*","t*","u*","v*","w*","x*","y*","z*"}))>0
然后复制/粘贴整个字段以仅显示字符串的值为TRUE或FALSE。
我已经尝试设置更多字段来替换,“CorrectLeft”和“CorrectRight”用于最终合并。我得到了正确的代码才能正常工作:
=IF(RIGHT(A2,1)="A",REPLACE(A2,LEN(A2),1,".01"),IF(RIGHT(A2,1)="B",REPLACE(A2,LEN(A2),1,".02"),IF(RIGHT(A2,1)="C",REPLACE(A2,LEN(A2),1,".03"))))…etc.
但是我很难为专栏的左侧做类似的事情。
任何人对我的左派代码有什么想法?
我的代码:
=IF(LEFT(A2,1)="A",REPLACE(A2,LEN(A2),1,"100000"),IF(LEFT(A2,1)="B",REPLACE(A2,LEN(A2),1,"200000"),IF(LEFT(A2,1)="C",REPLACE(A2,LEN(A2),1,"300000"),IF(LEFT(A2,1)="D",REPLACE(A2,LEN(A2),1,"400000"),IF(LEFT(A2,1)="E",REPLACE(A2,LEN(A2),1,"500000"),IF(LEFT(A2,1)="F",REPLACE(A2,LEN(A2),1,"600000"),IF(LEFT(A2,1)="G",REPLACE(A2,LEN(A2),1,"700000"),IF(LEFT(A2,1)="H",REPLACE(A2,LEN(A2),1,"800000"),IF(LEFT(A2,1)="I",REPLACE(A2,LEN(A2),1,"900000"),IF(LEFT(A2,1)="J",REPLACE(A2,LEN(A2),1,"1000000"),IF(LEFT(A2,1)="K",REPLACE(A2,LEN(A2),1,"1100000"),IF(LEFT(A2,1)="L",REPLACE(A2,LEN(A2),1,"1200000"),IF(LEFT(A2,1)="M",REPLACE(A2,LEN(A2),1,"1300000"),IF(LEFT(A2,1)="N",REPLACE(A2,LEN(A2),1,"1400000"),IF(LEFT(A2,1)="O",REPLACE(A2,LEN(A2),1,"1500000"),IF(LEFT(A2,1)="P",REPLACE(A2,LEN(A2),1,"1600000"),IF(LEFT(A2,1)="Q",REPLACE(A2,LEN(A2),1,"1700000"),IF(LEFT(A2,1)="R",REPLACE(A2,LEN(A2),1,"1800000"),IF(LEFT(A2,1)="S",REPLACE(A2,LEN(A2),1,"1900000"),IF(LEFT(A2,1)="T",REPLACE(A2,LEN(A2),1,"2000000"),IF(LEFT(A2,1)="U",REPLACE(A2,LEN(A2),1,"2100000"),IF(LEFT(A2,1)="V",REPLACE(A2,LEN(A2),1,"2200000"),IF(LEFT(A2,1)="W",REPLACE(A2,LEN(A2),1,"2300000"),IF(LEFT(A2,1)="X",REPLACE(A2,LEN(A2),1,"2400000"),IF(LEFT(A2,1)="Y",REPLACE(A2,LEN(A2),1,"2500000"),IF(LEFT(A2,1)="Z",REPLACE(A2,LEN(A2),1,"2600000")))))))))))))))))))))))))))
如果“CorrectLeft”和“CorrectRight”字段正常工作,我可以构建一个这样的公式,如果它们有字母,则合并所有已校正的字段。
=IF(AND(B2="FALSE",C2="FALSE"),A2),IF(AND(B2="FALSE",C2="TRUE"),D2),IF(AND(B2="TRUE",C2="FALSE"),E2),IF(AND(B2="TRUE",C2="TRUE"),A2)
我还尝试将几个函数组合成一个综合公式,但我认为最好在修改效率之前让这些单独的公式起作用。
答案 0 :(得分:0)
如果问题字段位于col A:
//copy this down
=TEXT(A1,"###")
这将创建另一个应按您希望排序的列。
答案 1 :(得分:0)
如果问题列为A,请添加排序列:
// copy these cells down
=IFERROR(IF(LEFT(A1,1)+0=LEFT(A1,1)+0,A1,"error"),CONCATENATE(LEFT(A1,1), TEXT(RIGHT(A1,LEN(A1)-1),"000000") ))
使用此公式,值B1变为(在排序列中)B000001,值B22变为B000022,值c65345变为c065345等。
如果您需要更长的最小数字集,请将公式中的“000000”更改为您需要的位数。
请注意,这仅适用于第二个数字始终为数字的情况,这与数据集的情况相似。例如,值AB23C会破坏这一点。
答案 2 :(得分:0)
我有一个解决方案,但它很难看。
将每个单元格的字符串分解为一个字符= IFERROR(VALUE(MID($ A2,COLUMNS($ A $ 2:A $ 2),1)),"")。您只需将其拖动到值的右侧即可获得最长值的最大长度。因此需要16个字符= 16个单元格。
接下来,在右边,= ISERR(VALUE(LEFT(A2,1))) 接下来,在右边,= ISERR(VALUE(RIGHT(A2,1)))
最后,在此右侧,= CONCATENATE(CONCATENATE(IF(ISERR(VALUE(LEFT(A2,1))),LEFT(A2,1),""),10000 + CONCATENATE(B2,C2,D2,E2,F2,G2)),IF(ISERR(VALUE(RIGHT(A2,1))),RIGHT(A2,1),"&#34))
10000需要比数据集中的最大位数多一个0。您的示例是4位数,因此使用了10,000。如果最大计数为16,那么它将是10,000,000,000,000,000。
还需要修改内部连接以添加用于第一个公式的每个列。此示例使用6,如果最大长度为16,则再添加10列,例如(H2,I2,......)。
然后,如果您对此结果进行排序,excel将弹出一个并选择第二个选项,分别对数字和文本进行排序和处理。