Неможливо отримати точну кількість записів у файлі csv


0

У мене є .csv-файл, який має деякі значення, відформатовані як абзаци з розривами рядків або іноді пункти кулі.

"STAT","ID","DESC"
"UPD", "1", "Updated"
"CHG", "2", "Changed"
"UPD", "3", "Updated.
Might have to update again"
"UPD", "4", "Updated.

 - once 
 - twice
 - thrice
"
"DEL", "5", "unknown"
"DEL", "6", "Deleted
Need to restore"

Мені потрібно порахувати кількість записів, які використовуються awk, як показано нижче, оскільки я знав, що другий стовпець є унікальним ідентифікатором, але повертає більше, ніж у мене. Зверху текст є звичайним манекеном, оскільки мені не дозволяють ділитися оригіналом, але я намагався відобразити якомога ближче.

 awk  '{print $2}' FS=","  sample.csv | wc -l 

Я навіть надрукував перший стовпець за допомогою awk '{print $ 1}', щоб перевірити лише значення першого стовпця, але вихід показує початкові частини нового рядка в абзацах.

Будь ласка, дайте мені знати, чи потрібна додаткова інформація, і я оновлю це питання.


Що ти робиш з результатом? Ви повинні використовувати awk? Якщо ви просто хочете отримати інформацію, спробуйте nirsoft csvfileviewer
yosh m

Мені потрібно порахувати кількість записів через командний рядок unix, як частину автоматизації тестового завдання (рахувати кількість записів кожного разу, коли ми отримуємо оновлений csv від постачальника). Я можу відкрити в excel і побачити правильне число один раз, але оскільки мені потрібно автоматизувати цей процес в командному рядку Unix, я намагаюся awk. У мене немає доступу до будь-яких інших інструментів / пакетів, крім тих, що є частиною командного рядка. Як sed, grep та awk.
vchollati

Відповіді:


0

Спосіб зробити це awk- це

awk -v RS=$'"\n"' 'END {print NR}' sample.csv
  • RS=$'"\n"'встановлює R ecord S eparator (який є новою рядки за замовчуванням) в рядок з трьох символів ", нового рядка, ". Цей синтаксис може працювати лише в bash. Це призведе до розкладання вашого файлу на такі записи:

    1: "STAT","ID","DESC

    2: UPD", "1", "Updated

    3: CHG", "2", "Changed

    4: UPD", "3", "Updated.
        Might have to update again

    5: UPD", "4", "Updated.
       
        - once
        - twice
        - thrice
       

    6: DEL", "5", "unknown

    7: DEL", "6", "Deleted
        Need to restore"

    Це передбачає, що у файлі немає останніх пробілів. 

  • 'END {print NR}' читає файл до кінця, а потім друкує номер запису - іншими словами, кількість записів.

Текстові файли, як правило, вважаються такими, що складаються з послідовності рядків, розмежованих символами нового рядка або послідовностями символів. І, як правило, "запис" у текстовому файлі вважається одним рядком. Але awkдозволяє задати роздільник записів, відмінний від нового рядка. Оскільки рядок quotes-newline-quote з'являється між кожною парою послідовних записів у вашому файлі, вказавши його, як роздільник записів розбиває файл на (майже майже) записи, які ви хочете.

Але роздільник записів схожий на стіну між двома кімнатами - він не є частиною жодної. При звичайній awkобробці ви бачите записи, що представляють собою рядки без символів нового рядка - вони видаляються. Аналогічно, у моїй відповіді вилучені послідовності цитат-новий рядок цитати. Але оскільки не існує розділювача записів перед першим записом або після останнього, перші та останні останні символи цитати не видаляються.

Якщо ви хочете обробити файл, один запис за один раз, це рішення може виявитися недостатньо хорошим, оскільки перший запис та останні записи трактуються по-різному. Я погоджуюсь (дещо) з рекомендацією Глена, що для будь-якої серйозної роботи слід використовувати «належний аналізатор CSV».


Я не розумію, як усунення закінчення та запуску цитат для кожного запису (за винятком 1-го та останнього записів) підрахувало правильно, але рішення все-таки спрацювало.
vchollati

Усунення кінцевого і стартового котирування для кожного запису (крім першого та останнього записів) не є відповіддю; це побічний ефект відповіді. "Я не розумію, як це працює ..." ... Див правки.
G-Man

Пояснення це прояснило, високо оцінили.
vchollati

0

Я настійно рекомендую вибрати мову за допомогою відповідного аналізатора CSV. Мені подобається рубін за це, це дуже стисло:

ruby -rcsv -e 'a = CSV.read(ARGV[0], :col_sep => ", "); puts a.length' file
7

Мені довелося змінити роздільники стовпців у рядку заголовка, щоб додати пробіли.


Гаразд, щойно зареєстровано в Інтернеті, і Ruby може бути встановлено за замовчуванням у більшості дистрибутивів Linux. Завтра перевірять і оновлюють публікацію. Дякую.
vchollati
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.