Manipulating Text with JavaScript
This page contains a list of functions that are designed to be used for manipulation text in variables. See JavaScript Text Analysis Functions for functions for interrogating text in variable labels and value labels.
The examples below assume a text variable (a string) containing the first eight letters of the alphabet, where every second letter is a capital: aBcDeFgH. In the examples below, we show both how to manipulate this as a string of text and how to manipulate a variable (constructed via Var s = "aBcDeFgH (see creating variables in the Expression).
Common ways to manipulate text
Expression using string | Expression using variable | Result | Explanation |
---|---|---|---|
"aBcDeFgH"+"aBcDeFgH" | s + s | aBcDeFgHaBcDeFgH | Concatenates (i.e., adds) the two strings together, producing:
aBcDeFgHaBcDeFgH. |
"aBcDeFgH".length | s.length | 8 | Returns the number of characters in the string |
"aBcDeFgH".substring(2) | s.substring(2) | cDeFgH | Returns all but the first two characters of the string) |
"aBcDeFgH".substring(2,4) | s.substring(2,4) | cD | Returns the first four character, excluding the first two characters) |
"aBcDeFgH".toUpperCase() | s.toUpperCase() | ABCDEFGH | Converts characters to capitals (uppercase) |
"aBcDeFgH".toLowerCase () | s.toLowerCase () | abcdefgh | Converts characters to lowercase |
"aBcDeFgH".indexOf("c") | s.indexOf("c") | 2 | The number of characters that precede the beginning of the search term (i.e., the bit in brackets) |
"aBcDeFgH".lastIndexOf("c") | s.lastIndexOf ("c") | 2 | The number of characters that precede the beginning of the last instance of the search term (i.e., the bit in brackets) |
"aBcDeFgH".slice(-2) | s.slice(-2) | gH | Returns the final two characters |
"aBcDeFgH".search("B") | x.search("B") | 1 | Returns the position where the search term appears in the string of text (where the initial position is 0, the second character is 1, etc.) |
"aabbBBBB".replace("BB","CC") | x.replace("BB","CC") | aabbCCBB | Replaces the first instance of a string with another string. |
"aabbBBBB".replace(/BB/g,"CC") | x.replace(/BB/g,"CC") | aabbCCCC | Replaces all instances of a string with another string (g stands for global). |
"aabbBBBB".replace(/BB/gi,"CC") | x.replace(/BB/gi,"CC") | aaCCCCCC | Replaces all instances of a string with another string, ignoring case. |
Example
Consider the situation where a data file has been set up containing a Categorical Variable where the Values and Labels are as shown in the first two columns, and the desire is to have a variable containing values as shown in the third column.
Value | Label | Desired Values (as a Text Variable) |
---|---|---|
1 | February 2006 | 1 Feb 2006 |
2 | March 2006 | 1 Mar 2006 |
3 | April 2006 | 1 Apr 2006 |
4 | May 20065 | 1 May 2006 |
… | ||
13 | February 2007 | 1 Feb 2007 |
Assuming that the variable is called MTH, the following expression would perform the desired conversion:
var monthYear = Q.Label(MTH); //turning label into text variable
var yearStart = monthYear.indexOf("20"); // century
"1 " + monthYear.substring(0,3) + " " + monthYear.substring(yearStart);
More elegantly, we could have written:
var monthYear = Q.Label(MTH); //turning label into text variable
"1 " + monthYear.substring(0,3) + " " + monthYear.slice(-4);
And, it could have been written parsimoniously as:
"1 " + Q.Label(MTH).substring(0,3) + " " + Q.Label(MTH).slice(-4);
Of course, using Q’s inbuilt functions for converting data to the Variable Type of Date is the fastest way of dealing with such data - see How to Create a Date Variable (i.e., these examples are for illustrative purposes only).
The role of the + operator
If you create an expression which has an arithmetic meaning, the arithmetic will be conducted. For example, ID + ID would create a new Text Variable where each observation’s value is double their value on the ID variable. For example, IDs from 1 to 10 would appear as:
2 4 6 8 10 12 14 16 18 20
By contrast, by adding a space between the variables (ID + " " + ID), Q instead treats the input variables as strings:
1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10