Création de nouvelles colonnes à partir de données dans un fichier existantJ'ai un grand ensemble de données avec l'une des colonnes de données contenant des cellules avec le format ci-dessous. Existe-t-il un moyen d'extraire les différents 'AppNames' en 3 colonnes distinctes. J'ai essayé la fonction Texte en colonnes dans Utilitaires, mais toutes les cellules de la colonne n'ont pas plus d'un nom d'application répertorié. Elles peuvent contenir des informations légèrement différentes, ce qui jette l'alignement et aboutit à des valeurs incorrectes dans mes nouvelles colonnes. … Idéalement, puis-je utiliser la chaîne 'AppName:' comme délimiteur? Donc, à partir de l'exemple ci-dessous ... je devrais me retrouver avec trois nouvelles colonnes - avec des données se rapportant à Application1, Application2 et Application3 ... merci
Format
tx: AppID: 32734, tx: AppName: Application1 , tx: ServerEnv: Développement, tx: ServerStatus: Deployed, tx: OwningVP: xxxxxxxx, tx: DevMgr: xxxxxxxxx, tx: OwningDirector: xxxxxxxxx, tx: AppMow: xxxxxxxxx, tx: : PCI: Non, tx: L5_MGR: xxxxxxxxx, tx: DataClass: Usage interne, tx: DRClass: Classe I, tx: AppType: Informatique prise en charge, tx: OrgL: TSO, tx: OrgL3: TMX, tx: OrgL4: Mobile VC, tx: AppID: 655369, tx: NomApp: Application2 , tx: OwningVP: xxxxxxxx, tx: DevMgr: xxxxxxxx, tx: OwningDirector: xxxxxxxxx, tx: Propriétaire de la propriété: xxxxxxxx, tx: BusinessOwner: xxxxxxxxx, tx: SOX: KDS Tâmâ € Restreint, tx: OrgL2: CBS, tx: OrgL3 :, tx: tx: AppID: 655364, tx: AppName: Application3
Re: Créer de nouvelles colonnes à partir de données d'un fichier existantJ'ai adopté une approche légèrement différente de votre problème. En regardant vos données, je me suis rendu compte que vous avez beaucoup de colonnes différentes, les lignes étant les applications. J'ai donc écrit un petit script qui résout tout cela. Maintenant, le problème est, il y a des erreurs dans les données. J'ai donc ajouté une zone dans le code qui tente de les réparer. N'ayant pas toutes vos données, je suis sûr qu'il y aura peut-être d'autres correctifs à mettre en place. Une fois ces données entrées, si vous souhaitez toujours que vos données soient alignées sur 3 colonnes, vous pouvez facilement effectuer une transposition des données dans les 3 colonnes.
Names Default To Here( 1 );
theData =
"tx:AppID:32734, tx:AppName:Application1, tx:ServerEnv:Development, tx:ServerStatus:Deployed, tx:OwningVP:xxxxxxxxx, tx:DevMgr:xxxxxxxxx, tx:OwningDirector:xxxxxxxxx, tx:AppOwner:xxxxxxxxx, tx:BusinessOwner:xxxxxxxxx, tx:SOX:No, tx:PCI:No, tx:L5_MGR:xxxxxxxxx, tx:DataClass:Internal Use, tx:DRClass:Class I, tx:AppType:IT Supported, tx:OrgL2:TSO, tx:OrgL3:TMX, tx:OrgL4:Mobile and VC, tx:AppID:655369, tx:AppName:Application2, tx:OwningVP:xxxxxxxx, tx:DevMgr:xxxxxxxx, tx:OwningDirector:xxxxxxxx, tx:AppOwner:xxxxxxxx, tx:BusinessOwner:xxxxxxxxx, tx:SOX:KFS Tier 2, tx::KBA Tier 1, tx:DataClass:Restricted, tx:OrgL2:CBS, tx:OrgL3:, tx: tx:AppID:655364, tx:AppName:Application3";
dt = New Table( "The Table" );
dt << delete columns( "Column 1" );
word# = 1;
While( Word( word#, theData, "," ) != "",
colNameList = dt << get column names( string );
theWord = trim(Word( word#, theData, "," ));
// Make found corrections
If( Trim( Word( 2, theWord, ":" ) ) == "tx",
theword = Word( 2, theword, ":" ) || ":" || Word( 3, theWord, ":" ) || ":" || Word( 4, theWord, ":" )
);
If( word( 1, theWord, ":") == "", theWord = "tx" || theWord );
if( word( 2, theWord, ":") == "",
theword = Word( 1, theword, ":" ) || ":" || word(1,Word( 3, theWord, " " )," ") || ":" ||
substr(Word( 3, theWord, ":" ),length(Word( 3, theWord, ":" ))+2);
);
if( word( 3, theWord, ":") == "",
theword = Word( 1, theword, ":" ) || ":" || word(1,Word( 2, theWord, ":" )," ") || ":" ||
substr(Word( 2, theWord, ":" ),length(Word( 1, Word( 2, theWord, ":" ), " " ))+2);
);
if(word(2,theword,":")=="KBA",show(theword));
colName = Word( 2, theWord, ":" );
If( Word( 2, theWord, ":" ) == "AppID",
dt << Add Rows( 1 );
);
If( N Rows( Loc( colNameList, colName ) ) == 0,
dt << New Column( colName, character );
);
Column( dt, colName )[N Rows( dt )] = Word( 3, theWord, ":" );
word#++;
);
Re: Créer de nouvelles colonnes à partir de données d'un fichier existantMerci Jim ... Je suppose que ce que j'essaie de faire, c'est d'extraire les données "AppName" de la colonne "Asset Tag" et de les insérer dans de nouvelles colonnes (Application n ° 1, n ° 2, n ° 3). Voir la capture d'écran ci-dessous.
(AppName: Exchange 2013 (350578) à partir des balises d'actif de la rangée 1 ci-dessous)
Certaines des lignes de la colonne 'Asset Tags' ont plusieurs noms AppName inclus et, malheureusement, elles ne sont pas uniformes, voir les exemples ci-dessous:
Exemple 1 format (1 AppName)
tx: AppID: 350578, tx: AppName: Exchange 2013 (350578), tx: ServerEnv: Production, tx: ServerStatus: Dans Maintenance, tx: OwningVP: xxxxxxxxx, tx: DevMgr: xxxxxxxxx, tx: OwningDirector: x, p. : PCI: Non, tx: L5_MGR: xxxxxxxxx, tx: EMEABanking: Niveau KBA 2, tx: DataClass: Fortement restreint, tx: DRClass: Classe I, tx: AppType: IT pris en charge, tx: OrgL2: TSO, tx: OrgL3: TMX, tx: OrgL4: gestion de la messagerie et du contenu
Exemple 2 format (3 AppNames)
tx: AppID: 32734, tx: NomApp: CITRIX (32734) , tx: ServerEnv: Développement, tx: ServerStatus: Déployé, tx: OwningVP: XXXXXXXXX, tx: DevMgr: XXXXXXX, tx: OwningDirector: XXXXXXXXX, tx: AppOwner: XXXXXXXXX, tx: BusinessOwner: XXXXXXX, tx:, : PCI: Non, tx: L5_MGR: XXXXXXXXX, tx: EMEABanking: Niveau KBA 2, tx: DataClass: Utilisation interne, tx: DRClass: Classe I, tx: AppType: Prise en charge informatique, tx: OrgL2: TSO, tx: OrgL, tx: Org3: TMX, tx: OrgL4: Mobile et VC, tx: AppID: 655369, tx: NomApp: EBOSS EMEA (655369) , tx: OwningVP: XXXXXXXXX, tx: DevMgr: XXXXXXXXX, tx: OwningDirector: XXXXXXXXX, tx: AppOwner: XXXXXXXXX, tx: BusinessOwner: XXXXXXXXX, tx: SOX: KFS Niveau 2, tx: L5_Mhr: Tier 1, tx: DataClass: Restreint, tx: OrgL2: CBS, tx: OrgL3: SVCS financière Dell, tx: OrgL4: Origines et maintenance du contrat de location, tx: AppID: 655364, tx: NomApp: TVALUE (655364)
Exemple 3 format (1 AppName, mais format différent)
ext: NomApp: Tension , ext: PCI: N, ext: OrgL3: TMX, ext: L5_Mgr: xxxxxxxxx, ext: Owning_Director: xxxxxxxxx, ext: App_Owner: xxxxxxxxx, ext: Owning_Grand: messagerie et contenu, externe, haute, sans fil, Sans fil, Protection, contenu non défini Balayage CC - Externe, tx: AppID: 2812, tx: NomApp: Exchange 2010, tx: ServerEnv: Production, tx: ServerStatus: Deployed, tx: OwningVP: xxxxxxxxx, tx: DevMgr: xxxxxxxxx, tx: OwningDirector: xxxxxxxxx, tx: AppOwner: xxxxxxxxx, tx: BusinessOwner: xxxxxxxxx, tx: SOX: Non, tx: PCI: Non, tx: L5_MGR: xxxxxxxxxx, tx: EMEABanking: Non, tx: Lx: tx: L5_MGR: xxxxxxxxx, tx: EMEABanking: Non AppType: Prise en charge informatique, tx: OrgL2: TSO, tx: OrgL3: TMX, tx: OrgL4: Gestion de la messagerie et du contenu
Remarque: La colonne d'application n ° 1 ci-dessous a été créée à l'aide de la fonction Text-to-Column dans Col> Utilitaires ...
Pas sûr si bien expliquer cela ;-(

Re: Créer de nouvelles colonnes à partir de données d'un fichier existantJe crois que ce code fera ce que vous voulez. Vous trouverez ci-joint une table de données contenant les 3 lignes des exemples fournis. Le script ci-dessous gère les extractions d'applications multiples
Names Default To Here( 1 );
dt = Current Data Table();
dt << New Column( "Application #1", character );
dt << New Column( "Application #2", character );
dt << New Column( "Application #3", character );
For( theRow = 1, theRow <= N Rows( dt ), theRow++,
word# = 1;
appName# = 1;
While( Word( word#, :Asset Tags[theRow], "," ) != "",
theWord = Trim( Word( word#, :Asset Tags[theRow], "," ) );
If( Word( 2, theWord, ":" ) == "AppName",
Column( dt, "Application #" || Char( appName# ) )[theRow] = Word( 3, theWord, ":" );
appName#++;
);
word#++;
);
);
Re: Créer de nouvelles colonnes à partir de données d'un fichier existantVoici une approche légèrement différente qui consiste à ajouter les valeurs au tableau. J'ai une fonction d'analyse en haut du code qui est similaire à mots , mais les délimiteurs peuvent être composés de plusieurs caractères.
//------------------------------------------------------------------------------
/*
Function Name: my_parse
Description: Parse text according to a given delimiter. Two delimiters in a row
will yield an empty list entry, which is different from the behavior
of WORDS
Returns: list of tokens
Arguments:
_text Text to determine be parsed
_delim Delimiter
*/
my_parse = function({_text, _delim},
{Default Local},
pname = "get_words";
if (is missing(_text),
// then
ret_list = {};
,
// else if
_text == "",
ret_list = {};
,
// else we've got some text to work with
ret_list = {};
len_delim = length(_delim);
istart = 1;
keep_going = 1;
while (keep_going,
iend = contains(_text, _delim, istart);
if (!iend,
keep_going = 0;
insertinto(ret_list, substr(_text, istart), 1);
,
insertinto(ret_list, substr(_text, istart, (iend - istart)), 1);
istart = iend + len_delim;
);
);
);
reverse(ret_list);
); // end my_parse
//------------------------------------------------------------------------------
dt = current data table();
dt << new column("Application #1", character);
dt << new column("Application #2", character);
dt << new column("Application #3", character);
for(i = 1, i <= nrows(dt), i++,
one_asset = dt:asset tags[i];
one_list = my_parse(one_asset, ", ");
app_list = {};
m = 0;
for (k = 1, k <= nitems(one_list), k++,
one_item = one_list[k];
aloc = contains(one_item, "AppName:");
if (aloc,
m++;
app_list[m] = substr(one_item, 8 + aloc);
);
);
show(app_list);
// Now add these to the respective Application # columns
for (k = 1, k <= nitems(app_list), k++,
cname = "Application #" || char(k);
column(dt, cname)[i] = app_list[k];
);
);