How can I write an IFF function in Informatica for the attached sample data. I have a target table which consist of different columns. I currently have different expressions like.
IIF(LTRIM(RTRIM(SUBSTR(HEADER_INFO,1,1)))='',NULL,LTRIM(RTRIM(SUBSTR(HEADER_INFO,1,1))))
IIF(LTRIM(RTRIM(SUBSTR(DETAIL_INFO,2,4)))='',NULL,LTRIM(RTRIM(SUBSTR(DETAIL_INFO,2,4))))
The first expression above picks up H from the first row below and assigns it to a column A, there is another expression function which assigns P to another column B, it continues until it reaches the last character on the first row and assigns it to a column P.
The second IFF function above reads 1 and assign it to a column W, then similar expression with different position assings P to a certain column X,another assins 009046678402 to column Y, then another assigns 40 to Z.
What i want to achieve is that, after reading and assigning values on the second row, if the next row after that starts with a 'D' again, it should still read it. But the current IFF function I have, only reads if there is rows alternate as
HP...
D1...
where as I want that if there is a scenario as shown in the attachment where you have
HP...
D1...
D2...
D3...
it should still read the and assign values ofenter image description here D1..., D2..., D3...
HP2519263013900HWA8365C DEFORD DONITA 1245327121 1184950479 2012516 0 201909202019092016 0
D1 P00904667840240
I resolved the issue by creating variable ports for each field and replacing the null in my TRIM with their respective variable ports like below IIF(LTRIM(RTRIM(SUBSTR(HEADER_INFO,1,1)))='',v_ID,LTRIM(RTRIM(SUBSTR(HEADER_INFO,1,1)))),
IIF(LTRIM(RTRIM(SUBSTR(HEADER_INFO,2,4)))='',v_LST_Name,LTRIM(RTRIM(SUBSTR(HEADER_INFO,2,4))))
Related
enter image description here
I have a table in OpenOffice that contains a column with region's codes (column J). Using table functions, how to get all codes that appear more than 5 times and write them in one cell?
Normally I would recommend breaking this problem down into smaller parts using helper columns. Or better yet, move the data into LibreOffice Base which can easily work with distinct values.
However, I managed to come up with a rather large formula that seems to do what you asked. Enter it as an array formula.
=TEXTJOIN(",";1;IF(COUNTIF(исходник.J$2:J$552;исходник.J2:J552)>5;IF(ROW(исходник.J2:J552)=MATCH(исходник.J2:J552;исходник.J$2:J$552;0)+ROW(J$2)-1;исходник.J2:J552;"")))
I can't test this on your actual data since your example is only an image, but let's say that there are six of both 77 and 37. Then this would show 77,37 as the result.
Here is a breakdown. Look up the functions in LibreOffice Online Help for more information.
=TEXTJOIN(",";1; — Join all results into a single cell, separated by commas.
IF(COUNTIF(исходник.J$2:J$552;исходник.J2:J552)>5; — Find codes that occur more than 5 times. This is the same as what you wrote.
IF(ROW(исходник.J2:J552)= — Compare the next result to the row number that we are currently looking at.
MATCH(исходник.J2:J552;исходник.J$2:J$552;0)+ROW(J$2)-1; — Determine the first row that has this code. We do this to get unique results instead of 6 or more of each code in the result.
исходник.J2:J552;""))) — Return the code. (Your formula simply returns 1 here, which doesn't seem to be what you want.) If it doesn't match, return an empty string rather than 0, because TEXTJOIN ignores empty strings.
I have a Google Sheet with many (many, many) cases of the following situation:
A B C D E
1 a b1 e1
2 a
3 b2 d e2
4 a e2
Basically each row lists content (information about research papers) scraped from a different location; theoretically, the values in each row should be the same, but since some locations lacked some information, and sometimes the information differs in some minor (but possibly important) way, there isn't 100% agreement throughout.
I'd like for each cell below such a group to display one value if all the non-empty values in that column are the same and to display nothing at all if there's some disparity between the non-empty values. See row 5 below:
A B C D E
1 a b1 e1
2 a
3 b2 d e2
4 a e2
5 a d
This is basically a first programmatical clean-up to assist further manual labor (which is unavoidable).
There's an example sheet available here - the real thing would have about 18 sets of values (title, authors, ISBN, publication, URL, keywords, etc), and 270 columns (each for another publication). The orange rows at the bottom are just pasted in manually but show the values I would like to get in the blue rows via formulas.
I realize this can be done with a massive string of IFs, but... surely there must be a way to write a formula that will extract all the non-empty values from an array or group of cells, compare them with each other, and return a single value if they're all equal?
Unfortunately, I'm drawing a blank...
=IFERROR(IF(COUNTA(UNIQUE(FILTER(B2:B5, B2:B5<>"", B2:B5<>"#N/A")))>1, ,
UNIQUE(FILTER(B2:B5, B2:B5<>"", B2:B5<>"#N/A"))))
or shorter:
=IF(COUNTUNIQUE(FILTER(D2:D5, D2:D5<>"", D2:D5<>"#N/A"))>1, ,
UNIQUE(FILTER(D2:D5, D2:D5<>"", D2:D5<>"#N/A")))
Countunique should work:
=if(countunique(A1:A4)=1,sortn(A1:A4,1),"")
I've used sortn because I want to remove any empty cells from the list of values before displaying what should be the single non-empty value and that is one way of doing it (empty cells are sorted to the end so won't appear).
Edit
If the data includes #N/A's probably the shortest way to deal with them would be to use the (to me slightly obscure) function countuniqueifs
=if(countuniqueifs(A1:A4,A1:A4,"<>#N/A")=1,sortn(A1:A4,1),"")
Blank cells and #N/A's are still sorted after everything else, so I think the sortn part should still be valid.
But there is a further issue with this - if the range contains empty strings returned from a formula, the sortn part won't work properly, so would have to fall back on filtering:
=if(countuniqueifs(C1:C4,C1:C4,"<>#N/A",C1:C4,"<>")=1,filter(C1:C4,C1:C4<>"#N/A",C1:C4<>""),"")
This is surely not an optimal solution but it works
=IF(COUNTIF(A1:A7,first_non_empty_cell)=COUNTA(A1:A7),first_non_empty_cell,"")
You might consider replacing first_non_empty_cell with
LOWER(INDEX(A1:A7,MATCH(1,INDEX((A1:A7<>0),0),0)))
or with the cell containing the value you want to use for comparisons.
I need help with what I'm sure is a simple formula that I just don't understand.
I have three columns. The first two hold my values and the third is meant to subtract them. However, when the first column is blank, I would like the third to also be blank. I have it close right now but when I type 0 in the first column, it treats that as a blank cell instead of using the 0 to give the sum.
Ex. of what I would like
expected result:
I can't seem to figure out the formula for the third column.
Yes this is a quirk that goes right back to the dawn of spreadsheet applications; in an empty worksheet the formula =A1 written anywhere other than the top left cell will evaluate to 0.
One way, in Google Sheets, is to use something like
=IF(ISBLANK(A1), ,A1 - B1)
In Microsoft Excel you need to use double quotations characters in the second argument, noting that this injects a blank string into the output.
This if statement (put in the 3rd Column) checks the first column if blank then just set cell as blank else perform the subtraction:-
=IF(A1="", "", A1-B1)
I have a cell that I want to use and IF statement to tell return information based on characters in the cell. I.E the cell has =M=WRFY, I want the statement to give me a start time based on the day within. I used this formula for the first set and it worked but for the next day it fails.
=IF(LEFT(I44,1)="S",H44,"")
I've tried entering the 2 where the 1 is to make it look at character 2 but its not working. Help!!
I'm trying to apply a formula without having it add the formula data to each and every cell - in other words, I need the cells that are receiving the formula to be untouched until they get their data.
I was searching around and it looked like an ARRAYFORMULA would work but it doesn't seem to be doing anything when I apply it.
For example, I want to apply this formula to a cell range: =SPLIT(E2, ",")). Each cell in the E column needs to be split into two the two adjacent cells next to it based on it's comma. When I try to apply =ARRAYFORMULA(SPLIT(E2:E99, ",")) only the cell I add this to gets the formula.
In addition to the contribution of pnuts, also try:
=ArrayFormula(iferror(REGEXEXTRACT(","&E2:E,"^"&REPT(",+[^,]+",COLUMN(OFFSET(A1,,,1,6))-1)&",+([^,]+)")))
Note: the last parameter of OFFSET can be changed to match the maximum number of values you have in the cells of the range E2:E (separated by a comma). E.g: if you have a no more than 3 values per cell, set it to three. The output will then be three columns wide (one column for each value).
Hope that makes sense ?
Also credits due to AdamL who (I believe) orginally crafted this workaround.
I think what you want may be array_constrain but for your example I can only at present offer you two formulae (one for each side of the comma):
=Array_constrain(arrayformula(left(E2:E,find(",",E2:E)-1)),match("xxx",E:E)-1,1)
=Array_constrain(arrayformula(mid(E2:E,find(",",E2:E)+1,len(E2:E))),match("xxx",E:E)-1,1)