تحويل CSV إلى YAML يُحوّل البيانات الجدولية المفصولة بفواصل إلى تنسيق YAML (YAML Ain't Markup Language). يصبح كل صف من ملف CSV إدخالاً في تسلسل YAML، ويُمثّل كل رأس عمود مفتاحاً في خريطة YAML. المخرجات مستند سهل القراءة، يعتمد المسافة البادئة للبنية، ويمكن لأدوات الإعداد وخطوط أنابيب البيانات تحليله مباشرةً دون ملفات مخطط إضافية.
اقتُرح YAML لأول مرة عام 2001، وبلغت مواصفته الحالية (YAML 1.2) عام 2009. وهو تنسيق الإعداد الافتراضي لملفات Kubernetes manifests وDocker Compose وكتب تشغيل Ansible وسير عمل GitHub Actions وكثير من أنظمة CI/CD. حين تكون بياناتك المصدر في جداول بيانات أو تصدير قاعدة بيانات، يُعدّ تحويل CSV إلى YAML أسرع طريقة لتوليد إدخالات إعداد أو بيانات seed fixtures أو مدخلات اختبار لهذه الأنظمة.
يجب أن يتعامل محوّل CSV إلى YAML الصحيح مع قواعد تحليل RFC 4180: الحقول المقتبسة التي تحتوي على فواصل أو أسطر جديدة، وعلامات الاقتباس المزدوجة المُهرَّبة، والمحددات المتعددة. على جانب YAML، يجب اقتباس السلاسل التي تشبه القيم المنطقية (yes وno وtrue وfalse) أو الأرقام أو null لمنع محللات YAML من تحويلها إلى أنواع غير مقصودة. ينبغي للمحوّل أيضاً معالجة المحتوى الموحد Unicode وإنتاج مخرجات UTF-8 صالحة، إذ تتطلب YAML 1.2 UTF-8 ترميزاً افتراضياً.
لماذا تستخدم محوّل CSV إلى YAML؟
كتابة YAML يدوياً من بيانات جداول البيانات مُضنية وعرضة للأخطاء. مسافة بادئة خاطئة أو حرف خاص غير مقتبس ينتج YAML غير صالح يُعطّل نشر الإعدادات أو استيراد البيانات. يُحلّل هذا المحوّل حقول CSV، ويعيّن الرؤوس إلى مفاتيح، ويُولّد مخرجات YAML صحيحة التنسيق والاقتباس.
⚡
تحويل فوري في المتصفح
الصق بيانات CSV أو ارفعها واحصل على مخرجات YAML صالحة فوراً. لا أدوات CLI للتثبيت، ولا مكتبات للاستيراد، ولا خطوة بناء مطلوبة.
🔒
حافظ على خصوصية بياناتك
يعمل التحليل والتحويل محلياً في متصفحك باستخدام JavaScript. لا تغادر بيانات CSV جهازك قط، ولا تُرسَل إلى أي خادم، ولا تُخزَّن أو تُسجَّل.
🎯
مخرجات YAML صحيحة التنسيق
تستخدم المخرجات المسافة البادئة الصحيحة، وتقتبس السلاسل التي قد تُفسَّر خطأً على أنها قيم منطقية أو أرقام، وتُولّد YAML 1.2 صالحة تجتاز أي أداة lint أو أداة تحقق من المخطط.
📋
دعم أي نمط CSV
كشف تلقائي للمحدِّدات: الفاصلة والفاصلة المنقوطة وعلامة الجدولة والشريط العمودي. دعم كامل لقواعد اقتباس RFC 4180 بما في ذلك علامات الاقتباس المزدوجة المُهرَّبة والحقول متعددة الأسطر وملفات UTF-8 المبدوءة بـBOM.
حالات استخدام تحويل CSV إلى YAML
إعدادات Kubernetes وDocker Compose
أنشئ كتل متغيرات البيئة أو أقسام بيانات ConfigMap أو تعريفات خدمات Docker Compose من جدول بيانات يحتوي على قيم إعداد. الصق مخرجات YAML مباشرةً في ملفات manifest.
بيانات كتب تشغيل Ansible
حوّل جرد CSV للمضيفين والأدوار والمتغيرات إلى ملفات متغيرات بتنسيق YAML (group_vars وhost_vars) تقرأها Ansible أصلاً دون أي إضافات تحليل مخصصة.
إعداد خطوط أنابيب CI/CD
حوّل جدول بيانات يحتوي على إدخالات مصفوفة البناء أو متغيرات البيئة أو أهداف النشر إلى كتل إعداد YAML لـGitHub Actions أو GitLab CI أو CircleCI. يُغني ذلك عن الكتابة اليدوية لتعريفات المصفوفة المتكررة.
بيانات seed fixtures لقواعد البيانات
تستخدم Rails وDjango وأطر أخرى YAML لـtest fixtures وبيانات seed. حوّل تصدير CSV من قاعدة البيانات إلى ملف YAML fixture يمكن لـORM تحميله مباشرةً في قاعدة بيانات الاختبار.
تحويل بيانات خطوط الأنابيب
يمكن لخطوط أنابيب ETL التي تقبل مدخلات YAML استيعاب بيانات CSV المحوّلة دون خطوة JSON وسيطة. تستخدم أدوات مثل dbt وDagster وPrefect YAML لتعريفات خطوط الأنابيب والإعداد.
تعلّم صياغة YAML
يمكن للطلاب والمطورين غير المعتادين على YAML لصق بيانات CSV مألوفة ومشاهدة كيف تتحول الصفوف الجدولية إلى تسلسلات وخرائط. تُوضّح مقارنة المدخلات والمخرجات قواعد المسافة البادئة وصياغة المفتاح-القيمة ومعالجة الأنواع.
مرجع تعيين CSV إلى YAML
لكل عنصر هيكلي في ملف CSV ما يقابله مباشرةً في YAML.
مفهوم CSV
ما يقابله في YAML
التفاصيل
CSV file
YAML document
The entire file becomes a YAML sequence (array) of mappings
Header row
Mapping keys
Each column header becomes a key in every mapping entry
Data row
Sequence item (- ...)
Each row becomes one mapping item in the top-level array
Cell value
Scalar value
Strings, numbers, and booleans are inferred by YAML parsers
Empty cell
null or empty string
Rendered as null, ~, or an empty value depending on the tool
Comma delimiter
Indentation + colon
CSV delimiters are replaced by YAML key: value structure
CSV مقابل YAML
CSV تنسيق مسطح مفصول بمحدد، لا يحتوي على معلومات أنواع أو تسلسل هرمي. YAML مجموعة شاملة لـJSON تعتمد المسافة البادئة للتداخل، وتدعم أنواع بيانات متعددة، وتسمح بالتعليقات. يعتمد الاختيار على ما تتوقعه الأداة التالية في سلسلة المعالجة.
CSV
نص عادي، سجل واحد في كل سطر. كل قيمة سلسلة نصية. لا تسلسل هرمي ولا تداخل ولا تعليقات. حجم ملف صغير. مدعوم بشكل عالمي من جداول البيانات وقواعد البيانات وأدوات سطر الأوامر. معرَّف بموجب RFC 4180. الأمثل لنقل البيانات الجدولية المجمّعة بين الأنظمة التي تتفق على ترتيب الأعمدة وأنواعها.
YAML
تنسيق يعتمد المسافة البادئة مع دعم أصلي للسلاسل النصية والأعداد الصحيحة والكسرية والقيم المنطقية وnull والتواريخ والتسلسلات (المصفوفات) والخرائط (الكائنات). يسمح بالتعليقات السطرية باستخدام #. يُستخدم تنسيق الإعداد الأساسي لـKubernetes وDocker Compose وAnsible وGitHub Actions ومعظم أدوات DevOps الحديثة. YAML 1.2 مجموعة شاملة لـJSON، لذا فأي JSON صالح هو أيضاً YAML صالح.
أمثلة برمجية
أمثلة عملية في Node.js وPython وGo وأدوات سطر الأوامر. كل مثال يقرأ صف رأس CSV كمفاتيح YAML، ويعيّن كل صف بيانات إلى إدخال في التسلسل، ويتعامل مع الاقتباس للقيم ذات الأنواع المبهمة.
JavaScript (Node.js)
import { parse } from 'csv-parse/sync'
import { stringify } from 'yaml'
const csv = `name,age,city
Alice,30,Berlin
Bob,25,"New York"`
const records = parse(csv, { columns: true, skip_empty_lines: true })
console.log(stringify(records))
// → - name: Alice
// → age: "30"
// → city: Berlin
// → - name: Bob
// → age: "25"
// → city: New York
// Vanilla JS (no dependencies)
function csvToYaml(csv) {
const [headerLine, ...dataLines] = csv.trim().split('\n')
const headers = headerLine.split(',')
return dataLines.map(line => {
const values = line.split(',')
return headers.map((h, i) => ` ${h}: ${values[i] || ''}`).join('\n')
}).map(block => `- ${block.trimStart()}`).join('\n')
}
Python
import csv, io, yaml
csv_string = """name,age,city
Alice,30,Berlin
Bob,25,New York"""
reader = csv.DictReader(io.StringIO(csv_string))
data = list(reader)
# default_flow_style=False produces block-style YAML
print(yaml.dump(data, default_flow_style=False, sort_keys=False))
# → - age: '30'
# → city: Berlin
# → name: Alice
# → - age: '25'
# → city: New York
# → name: Bob
# Preserve insertion order with sort_keys=False (Python 3.7+)
# To type-cast numbers: data = [{k: int(v) if v.isdigit() else v ...}]
Go
package main
import (
"encoding/csv"
"fmt"
"gopkg.in/yaml.v3"
"strings"
)
func main() {
input := "name,age,city
Alice,30,Berlin
Bob,25,New York"
r := csv.NewReader(strings.NewReader(input))
records, _ := r.ReadAll()
headers := records[0]
var data []map[string]string
for _, row := range records[1:] {
entry := make(map[string]string)
for i, h := range headers {
entry[h] = row[i]
}
data = append(data, entry)
}
out, _ := yaml.Marshal(data)
fmt.Println(string(out))
// → - age: "30"
// → city: Berlin
// → name: Alice
// → - age: "25"
// → city: New York
// → name: Bob
}
CLI (yq / Miller)
# Using yq (https://github.com/mikefarah/yq)
# yq reads CSV with --input-format=csv
yq --input-format=csv --output-format=yaml '.' data.csv
# Using Miller (mlr) — converts between CSV, JSON, YAML, and more
mlr --icsv --oyaml cat data.csv
# Python one-liner for quick conversion
python3 -c "
import csv, sys, yaml
data = list(csv.DictReader(sys.stdin))
print(yaml.dump(data, default_flow_style=False, sort_keys=False))
" < data.csv
الأسئلة الشائعة
كيف يعمل تحويل CSV إلى YAML؟
يقرأ المحوّل الصف الأول كرؤوس أعمدة. يصبح كل صف لاحق خريطة YAML (كائن مفتاح-قيمة)، وتُجمَع جميع الخرائط في تسلسل YAML (مصفوفة). النتيجة قائمة من الكائنات حيث يأتي كل مفتاح من الرأس وكل قيمة من محتوى الخلية.
ماذا يحدث للقيم مثل "true" أو "yes" أو "null" في ملف CSV؟
تُفسّر محللات YAML القيم غير المقتبسة true وfalse وyes وno وnull على أنها قيم مكتوبة لا سلاسل نصية. يقتبس المحوّل هذه القيم للحفاظ عليها سلاسل في المخرجات. على سبيل المثال، تصبح خلية CSV تحتوي على "yes" القيمة '"yes"' في مخرجات YAML، مما يمنع أداة الإعداد من تفسيرها كقيمة منطقية.
هل يمكنني تحويل YAML إلى CSV؟
نعم، طالما كان YAML تسلسلاً مسطحاً من الخرائط (مصفوفة كائنات بقيم نصية). هياكل YAML المتداخلة ذات الخرائط العميقة أو الأنواع المختلطة لا يمكن تمثيلها بنظافة كصفوف CSV. للهياكل المسطحة، تتولى أدوات مثل yq وMiller (mlr) أو وحدتا yaml وcsv في Python عملية التحويل العكسي.
ما الفرق بين تحويل CSV إلى YAML وتحويله إلى JSON؟
كلاهما ينتج بيانات منظمة من مدخلات CSV مسطحة. يستخدم JSON الأقواس المعكوفة والمستطيلة مع قواعد اقتباس صارمة. يستخدم YAML المسافة البادئة والنقطتين، ويدعم التعليقات، وأسهل في القراءة والتعديل يدوياً. تتوقع معظم أدوات DevOps (Kubernetes وAnsible وDocker Compose) YAML، بينما تتوقع معظم واجهات برمجة التطبيقات على الويب والأدوات المبنية على JavaScript مدخلات JSON.
كيف تُعالَج الأرقام والتواريخ في المخرجات؟
يُعامل CSV كل قيمة كسلسلة نصية. ستكتشف محللات YAML الأرقام غير المقتبسة (42 و3.14) والتواريخ بتنسيق ISO (2024-01-15) تلقائياً وتعاملها كأنواعها الحقيقية. إن أردت بقاء جميع القيم سلاسل نصية، يمكن للمحوّل اقتباس كل قيمة. أما إن أردت استنتاج الأنواع، اترك القيم دون اقتباس ودع محلل YAML يتولى تحليل الأنواع.
هل يتعامل المحوّل مع ملفات CSV الكبيرة؟
تعمل الأداة كلياً في المتصفح، لذا يعتمد الأداء على الذاكرة المتاحة وحدود تبويب المتصفح. تُحوَّل الملفات التي يصل حجمها إلى بضعة ميغابايتات (عشرات الآلاف من الصفوف) دون مشاكل على الأجهزة الحديثة. للملفات الكبيرة جداً (أكثر من 100 ميغابايت)، استخدم أداة CLI مثل وحدتي csv وyaml في Python، أو encoding/csv مع gopkg.in/yaml.v3 في Go، أو Miller (mlr) التي تبث البيانات دون تحميل كل شيء في الذاكرة.
هل تُنتج الأداة مخرجات YAML 1.1 أم YAML 1.2؟
تُنتج هذه الأداة مخرجات YAML 1.2. الفرق الرئيسي عن YAML 1.1 أن 1.2 ألغت "مشكلة النرويج" (تفسير 'no' غير المقتبسة كـboolean false) وحققت توافقاً أفضل مع JSON. تدعم معظم المحللات الحديثة (yaml.v3 في Go وPyYAML مع safe_load في Python وPsych في Ruby) YAML 1.2. إن كانت أداتك تتطلب توافق 1.1، فستُحلَّل المخرجات بصورة صحيحة في معظم الحالات لأن 1.2 متوافقة مع الإصدارات السابقة للهياكل الشائعة.