From 93eab0cacf5ac7ff16c1970a87a6fc653a51fb55 Mon Sep 17 00:00:00 2001 From: Josh Radcliff Date: Wed, 17 Jun 2026 15:49:16 -0400 Subject: [PATCH] feat(sample): use JSON input for audience sample Change-Id: I0c9a340bc6d77437f08f3ed2564ba5513e583827 --- samples/IngestAudienceMembers.cs | 89 +++++----------------- samples/sampledata/audience_members_1.csv | 5 -- samples/sampledata/audience_members_1.json | 35 +++++++++ 3 files changed, 55 insertions(+), 74 deletions(-) delete mode 100644 samples/sampledata/audience_members_1.csv create mode 100644 samples/sampledata/audience_members_1.json diff --git a/samples/IngestAudienceMembers.cs b/samples/IngestAudienceMembers.cs index 28739e9..79b4522 100644 --- a/samples/IngestAudienceMembers.cs +++ b/samples/IngestAudienceMembers.cs @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System.Text.Json; using CommandLine; using Google.Ads.DataManager.Util; using Google.Ads.DataManager.V1; @@ -22,7 +23,7 @@ namespace Google.Ads.DataManager.Samples // // Sends a without using encryption. // - // User data is read from a data file. See the audience_members_1.csv file in the + // User data is read from a data file. See the audience_members_1.json file in the // sampledata directory for an example. // public class IngestAudienceMembers @@ -73,11 +74,11 @@ public class Options public string AudienceId { get; set; } = null!; [Option( - "csvFile", + "jsonFile", Required = true, - HelpText = "Comma-separated file containing user data to ingest" + HelpText = "JSON file containing user data to ingest" )] - public string CsvFile { get; set; } = null!; + public string JsonFile { get; set; } = null!; [Option( "validateOnly", @@ -97,7 +98,7 @@ public void Run(Options options) options.LinkedAccountType, options.LinkedAccountId, options.AudienceId, - options.CsvFile, + options.JsonFile, options.ValidateOnly ); } @@ -111,7 +112,7 @@ private void RunExample( AccountType? linkedAccountType, string? linkedAccountId, string audienceId, - string csvFile, + string jsonFile, bool validateOnly ) { @@ -130,11 +131,8 @@ bool validateOnly ); } - // Reads the audience members from the CSV file. - // Each row of the CSV file should be a single audience member. - // The first column of each row should be the email address. - // The second column of each row should be the phone number. - List memberList = ReadMemberDataFile(csvFile); + // Reads the audience members from the JSON file. + List memberList = ReadMemberData(jsonFile); // Creates a factory that will be used to generate the appropriate data manager. var userDataFormatter = new UserDataFormatter(); @@ -147,7 +145,7 @@ bool validateOnly var userDataBuilder = new UserData(); // Adds a UserIdentifier for each valid email address for the member. - foreach (var email in member.EmailAddresses) + foreach (var email in member.Emails) { try { @@ -257,6 +255,9 @@ bool validateOnly }, }; + // Logs the request. + Console.WriteLine($"Request #{requestCount}:\n{request}"); + // Sends the data to the Data Manager API. IngestAudienceMembersResponse response = ingestionServiceClient.IngestAudienceMembers(request); @@ -267,66 +268,16 @@ bool validateOnly private class Member { - public List EmailAddresses { get; } = new List(); - public List PhoneNumbers { get; } = new List(); + public List Emails { get; set; } = new List(); + public List PhoneNumbers { get; set; } = new List(); } - private List ReadMemberDataFile(string dataFile) + private List ReadMemberData(string jsonFile) { - var members = new List(); - using (var reader = new StreamReader(dataFile)) - { - string? line; - int lineNumber = 0; - while ((line = reader.ReadLine()) != null) - { - lineNumber++; - if (line.StartsWith("#")) - // Skips comment row. - continue; - - // Expected format: - // email_1,email_2,email_3,phone_1,phone_2,phone_3 - string[] columns = line.Split(','); - if (columns[0] == "email_1") - // Skips header row. - continue; - - var member = new Member(); - for (int col = 0; col < columns.Length; col++) - { - if (string.IsNullOrWhiteSpace(columns[col])) - { - continue; - } - - if (col < 3) - { - member.EmailAddresses.Add(columns[col]); - } - else if (col < 6) - { - member.PhoneNumbers.Add(columns[col]); - } - else - { - Console.WriteLine($"Ignoring column index {col} in line #{lineNumber}"); - } - } - - if (!member.EmailAddresses.Any() && !member.PhoneNumbers.Any()) - { - // Skips the row since it contains no user data. - Console.WriteLine($"Ignoring line {lineNumber}. No data."); - } - else - { - // Adds the parsed user data to the list. - members.Add(member); - } - } - } - return members; + string jsonString = File.ReadAllText(jsonFile); + var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + return JsonSerializer.Deserialize>(jsonString, options) + ?? new List(); } } } diff --git a/samples/sampledata/audience_members_1.csv b/samples/sampledata/audience_members_1.csv deleted file mode 100644 index bdb6b60..0000000 --- a/samples/sampledata/audience_members_1.csv +++ /dev/null @@ -1,5 +0,0 @@ -email_1,email_2,email_3,phone_1,phone_2,phone_3 -dana@example.com,DanaM@example.com,,,, -ALEXF@example.com, AlexF@cymbalgroup.com,alexF@altostrat.com,+1-800‑555‑0100,+1 800‑555‑0101,+1 800‑555‑0102 -quinn@CYMBALGROUP.com, baklavainthebalkans@gmail.com ,,,, -rosario@example.org,cloudySanFrancisco@GMAIL.com,,+1-800‑555‑0110,, diff --git a/samples/sampledata/audience_members_1.json b/samples/sampledata/audience_members_1.json new file mode 100644 index 0000000..f40064d --- /dev/null +++ b/samples/sampledata/audience_members_1.json @@ -0,0 +1,35 @@ +[ + { + "emails": [ + "dana@example.com", + "DanaM@example.com" + ] + }, + { + "emails": [ + "ALEXF@example.com", + "AlexF@cymbalgroup.com", + "alexF@altostrat.com" + ], + "phoneNumbers": [ + "+1-800-555-0100", + "+1 800-555-0101", + "+1 800-555-0102" + ] + }, + { + "emails": [ + "quinn@CYMBALGROUP.com", + "baklavainthebalkans@gmail.com" + ] + }, + { + "emails": [ + "rosario@example.org", + "cloudySanFrancisco@GMAIL.com" + ], + "phoneNumbers": [ + "+1-800-555-0110" + ] + } +]