Как разбить строку по знаку?
Есть строка. Это кусок из csv файла.
"a,b",a b,,,,,,,,,,,,,,,,,,,,
Я разбиваю данные из csv по строкам используя split("rn") а затем разбиваю по клеткам используя split(",")
Но если в клетке прописать запятую например a,b то разбиение произойдет не верно.
Если в клетке нет запятой то данные из клетки будут выглядеть так
a b
Если в клетке есть запятая то данные из клетки будут выглядеть так
"a,b"
Не могу придумать как разбить эту троку так чтоб запятая такм где "a,b" игнорировалась.
Есть ли способ как то праильно разбить эти данные?
Дополнительно:
Я разбиваю данные из csv по строкам используя split("rn")
это уже неверно, корректно прочитать csv можно только последовательным чтением стейт машиной (немного ускоренной работой не по каждому символу, а через чтение кусками до ближайшего служебного символа).
function CSVToArray(strData, strDelimiter = ','){ const objPattern = new RegExp( "(\" + strDelimiter + "|\r?\n|\r|^)" + "(?:"([^"]*(?:""[^"]*)*)"|" + "([^"\" + strDelimiter + "\r\n]*))", 'gi' ); const arrData = [[]]; let arrMatches = null; while (arrMatches = objPattern.exec(strData)){ const strMatchedDelimiter = arrMatches[ 1 ]; if ( strMatchedDelimiter.length && strMatchedDelimiter !== strDelimiter ) { arrData.push([]); } const strMatchedValue = arrMatches[2] ? arrMatches[2].replace(new RegExp("""", 'g' ), """) : arrMatches[3]; arrData[arrData.length - 1].push(strMatchedValue); } return( arrData ); } console.log(CSVToArray('"a,b",a b,')); // Array(3) [ "a,b", "a b", "" ] |
function CSVToArray(strData, strDelimiter = ','){ const objPattern = new RegExp( "(\" + strDelimiter + "|\r?\n|\r|^)" + "(?:"([^"]*(?:""[^"]*)*)"|" + "([^"\" + strDelimiter + "\r\n]*))", 'gi' ); const arrData = [[]]; let arrMatches = null; while (arrMatches = objPattern.exec(strData)){ const strMatchedDelimiter = arrMatches[ 1 ]; if ( strMatchedDelimiter.length && strMatchedDelimiter !== strDelimiter ) { arrData.push([]); } const strMatchedValue = arrMatches[2] ? arrMatches[2].replace(new RegExp("""", 'g' ), """) : arrMatches[3]; arrData[arrData.length - 1].push(strMatchedValue); } return( arrData ); } console.log(CSVToArray('"a,b",a b,')); // Array(3) [ "a,b", "a b", "" ]
Ответы:
Привет.
Воспользоваться регулярными выражениями.
Если правильно понял твою задачу, то в твоем случае должно быть: /,(?!s*")/
const string = "a,b",a b,,,,,,,,,,,,,,,,,,, const cells = string.split(/,(?!s*")/); console.log(cells); //// [ "a,b", "a b", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" ] |
const string = "a,b",a b,,,,,,,,,,,,,,,,,,, const cells = string.split(/,(?!s*")/); console.log(cells); //// [ "a,b", "a b", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" ]
- Запустил данный код в консоли получил
['"a', 'b"', 'a b', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
['"a', 'b"', 'a b', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
- newaitix, попробуй так: /(?:,|"(?:[^"]+?)")/
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для разделения строки по определенному знаку в PHP вы можете использовать функцию explode(). Эта функция разбивает строку на подстроки, используя указанный разделитель, и возвращает массив подстрок.
Пример:
$str = "apple,banana,cherry"; $fruits = explode(",", $str); foreach ($fruits as $fruit) { echo $fruit . "<br>"; }
В этом примере строка "apple,banana,cherry" будет разбита на подстроки по запятой, и каждая подстрока будет выведена на экран с помощью цикла foreach.
Вы также можете использовать функцию str_split(), если вам нужно разбить строку на отдельные символы:
$str = "hello"; $chars = str_split($str); foreach ($chars as $char) { echo $char . "<br>"; }
Этот код разобьет строку "hello" на отдельные символы и выведет каждый символ на экран.
Если вам нужно разделить строку на слова, вы можете воспользоваться функцией explode() с пробельным символом в качестве разделителя:
$str = "Lorem ipsum dolor sit amet"; $words = explode(" ", $str); foreach ($words as $word) { echo $word . "<br>"; }
Этот код разобьет строку "Lorem ipsum dolor sit amet" на отдельные слова и выведет каждое слово на экран.
Таким образом, вы можете легко разбить строку по знаку или другому разделителю, используя функции explode() или str_split() в PHP.