1
  • I have tried so many things now that I am just confused.
  • I am not understanding the way char arrays work.
  • I can't get the date and names extracted. And when I use just strings, I jam up the memory.

Below was my last attempt, before asking the question.

while (f.available()) {
 String line = f.readStringUntil('\n');
 if (line.startsWith("04-23")) {
 currentDay = 1;
 int str_len = line.length() + 1;
 char char_array[str_len];
 line.toCharArray(char_array, str_len);
 Serial.println(char_array); // Everything works to here
 for (int j = 0; j < 2; j++) {
 b += char_array[j];
 }
 bMth = b.toInt (); // This should be an int of the birth month in this case: 04
 }
}
Var:
format: MM-DD-YYYY,Name // this is inside the file
line = "04-23-2020,James" // This is the output from - Serial.println(char_array); 

What I am trying to do is

  • Extract the month/day so that I can compare it to today.
  • The year so I can calculate the age.
  • The name to display on OLED.
  • Everything else seems to work, but I can't get my head wrapped around the char array access.

To do this in PowerShell I would do:

$line = "04-23-2020,James"
$dob = ($line.Split(","))[0]
$bMth = ($dob.Split("-"))[0] # This is not used in this example
$bDy = ($dob.Split("-"))[1] # This is not used in this example
$bYr = ($dob.Split("-"))[2]
$age = $(get-date -UFormat %Y) - $bYr
Clear-Host
Write-Host (@'
Name: {0}
Age: {1}
'@ -f $($line.Split(","))[1], $age)

In Python:

import datetime as dt
line = "04-23-2020,James"
dob = (line.split(',')[0])
bMth = (dob.split("-"))[0] # This is not used in this example
bDy = (dob.split("-"))[1] # This is not used in this example
bYr = (dob.split("-"))[2]
age = int(dt.datetime.now().year) - int(bYr)
print('Name: ',(line.split(',')[1]))
print('Age: ', age)
asked Apr 26, 2021 at 20:52
2
  • Does this help? majenko.co.uk/blog/splitting-text-c Commented Apr 26, 2021 at 20:53
  • I recommend learning how to use the strtok() function. It is also described in Majenkos blog entry Commented Apr 26, 2021 at 21:50

2 Answers 2

1

When working with Arduino, cplusplus.com is your friend. Scroll down and look on the left side under (string.h). Lot's of great char functions there. Other useful functions such as iota() - cplusplus.com.

Here's one way to accomplish the parsing of the input data.

// Sketch uses 2064 bytes (6%) of program storage space.
// Global variables use 323 bytes (15%) of dynamic memory.
// Arduino IDE 1.8.9.
char line[] = "04-23-2020,James";
char Name[100];
unsigned int Month, Day, Year;
// Make an attempt to validate the input data.
byte Counter = 0;
void setup(){
 Serial.begin(9600);
 char * pch = strtok(line, "-,");
 while(pch != NULL){
 if(Counter == 0){Month = atoi(pch);}
 else if(Counter == 1){Day = atoi(pch);}
 else if(Counter == 2){Year = atoi(pch);}
 else if(Counter == 3){strcpy(Name, pch);}
 pch = strtok(NULL, "-,");
 Counter += 1;
 }
 // Print out the data.
 if(Counter == 4){
 Serial.println(Month);
 Serial.println(Day);
 Serial.println(Year);
 Serial.println(Name);
 }
 else{
 Serial.println("Error");
 }
}
void loop(){}
answered Apr 26, 2021 at 23:12
0

You could try sscanf if your data format is fixed, something like this:

char line[] = "04-23-2020,James";
int day, month, year;
char name[100];
if (sscanf(line, "%d-%d-%d,%s", &month, &day, &year, name) == 4)
{
 // Process the four items.
}
answered Apr 26, 2021 at 22:03
1
  • 1
    but the code for scanf takes 1.5kB flash memory Commented Apr 27, 2021 at 4:57

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.