XER Dosyasının İçinde: Primavera P6 Export Formatını Anlamak
Oracle Primavera P6'nın XER dosya formatına teknik bir bakış — dosya yapısı, temel tablolar ve XER verisini programatik olarak parse etmek.
Yıllar içinde binlerce XER dosyası açtım. Çoğu planlamacı bu dosyalara kara kutu muamelesi yapar — bir sistemden export edilir, diğerine import edilir, olan biten budur. Oysa formatı anlamak size gerçek bir avantaj sağlar; özellikle import sırasında bir şeyler ters gittiğinde ya da program verisini P6 dışında analiz etmeniz gerektiğinde.
XER Dosyası Nedir?
XER dosyası, Primavera P6’dan alınan düz metin bir export’tur. Bir veya birden fazla projenin eksiksiz bir anlık görüntüsünü içerir — aktiviteler, ilişkiler, kaynaklar, takvimler, WBS, kodlar, her şey.
Format tab ile ayrılmıştır ve belirli bir yapıya sahiptir. Herhangi bir XER dosyasını Notepad, VS Code ya da başka bir metin editöründe açıp doğrudan okuyabilirsiniz. Kapalı bir binary format yok. Şifreleme yok. Sadece yapılandırılmış metin.
XER dosyalarını bu kadar kullanışlı yapan da bu sadelik. P6 veri alışverişinin ortak dili durumundalar.
Dosya Yapısı
Her XER dosyası şu kalıbı izler:
ERMHDR 24.8.0 2026-03-15 Project Admin ...
%T PROJECT
%F proj_id proj_short_name ...
%R 1042 PRJ-2026-001 ...
%T PROJWBS
%F wbs_id proj_id wbs_short_name ...
%R 5001 1042 PHASE-1 ...
%R 5002 1042 PHASE-2 ...
%T TASK
%F task_id proj_id task_code task_name ...
%R 10001 1042 A1010 Mobilize Equipment ...
İşaretçiler şunlar:
ERMHDR— Başlık satırı. P6 sürümünü, export tarihini, export’u yapan kullanıcıyı ve veritabanı bilgisini içerir. Her zaman ilk satırdır.%T— Tablo işaretçisi. Arkasından tablo adı gelir. Bu satırdan bir sonraki%Tsatırına kadar olan her şey bu tabloya aittir.%F— Alan tanımı. Geçerli tablonun kolon adlarını tab ile ayrılmış olarak listeler.%R— Satır verisi.%Fsatırındaki alan sırasına uyan, tab ile ayrılmış tek bir veri kaydı.%E— Bitiş işaretçisi. Dosyanın en sonunda yer alır.
Formatın tamamı bundan ibaret. İç içe yapı yok, XML etiketi yok, JSON parantezi yok. Sadece başlıklar, tablolar, alanlar ve satırlar.
Temel Tablolar ve İçerikleri
Tipik bir XER dosyasında 20-40 tablo bulunur. En çok işe yarayanlar şunlar:
| Tablo | İçerik |
|---|---|
PROJECT |
Proje düzeyinde veri — ID, ad, planlanan başlangıç/bitiş, data date, durum |
PROJWBS |
WBS yapısı — hiyerarşik; üst öğe referansları parent_wbs_id üzerinden |
TASK |
Aktiviteler — programın çekirdeği. Aktivite düzeyindeki tüm veri burada |
TASKPRED |
Mantık bağlantıları — aktiviteler arası predecessor/successor ilişkileri |
RSRC |
Kaynak sözlüğü — kaynak adları, ID’leri, tipleri, birimleri |
TASKRSRC |
Kaynak atamaları — hangi kaynağın hangi aktiviteye atandığı |
CALENDAR |
Takvim tanımları — çalışma saatleri, tatiller, istisnalar |
ACTVCODE |
Activity code tip tanımları |
ACTVTYPE |
Activity code değer tanımları |
TASKACTV |
Activity code atamaları — hangi kodun hangi aktiviteye atandığı |
ACCOUNT |
Maliyet hesabı (cost account) sözlüğü |
UDFTYPE |
User Defined Field tanımları |
UDFVALUE |
Aktivitelere atanmış UDF değerleri |
TASK Tablosuna Yakından Bakış
Program asıl burada yaşar. 5.000 aktivitelik bir projede yalnızca TASK tablosu yüzlerce kolon ve binlerce satır barındırabilir.
İlk baktığım temel alanlar:
task_id— P6’nın dahili sayısal ID’si. Kullanıcıların arayüzde gördüğü Activity ID değildir. Birincil anahtar budur.task_code— Kullanıcıların gördüğü Activity ID (örn.A1010,CIV-0350). Planlamacıların referans verdiği alan budur.task_name— Aktivite açıklaması.task_type—TT_Task(Task Dependent),TT_Rsrc(Resource Dependent),TT_Mile(Milestone),TT_FinMile(Finish Milestone),TT_LOE(Level of Effort),TT_WBS(WBS Summary).target_start_date/target_end_date— Baseline tarihleri.act_start_date/act_end_date— Gerçekleşen tarihler. Aktivite başlamadıysa boştur.restart_date/reend_date— Kalan erken başlangıç ve bitiş.remain_drtn_hr_cnt— Saat cinsinden kalan süre. Gün elde etmek için takvimin saat/gün değerine bölün.total_float_hr_cnt— Saat cinsinden total float. Aynı dönüşüm burada da geçerli.status_code—TK_NotStart,TK_Active,TK_Complete.phys_complete_pct— Fiziksel tamamlanma yüzdesi.
TASKPRED Tablosu
Program mantığınızı bu tablo tanımlar. Her satır bir ilişkidir:
task_pred_id— Bu bağlantıya özgü IDtask_id— Successor aktivite (kısıtlanan taraf)pred_task_id— Predecessor aktivitepred_type—PR_FS(Finish-to-Start),PR_FF(Finish-to-Finish),PR_SS(Start-to-Start),PR_SF(Start-to-Finish)lag_hr_cnt— Saat cinsinden lag. Negatif olabilir.
Sorunlu bir program üzerinde adli analiz yaparken, TASK’tan sonra baktığım ikinci tablo budur. Eksik ya da kopuk mantık burada net biçimde ortaya çıkar.
XER Dosyalarını Python ile Parse Etmek
Özel bir kütüphaneye ihtiyacınız yok. Format, 20 satırda parse edilecek kadar basit:
def parse_xer(filepath):
tables = {}
current_table = None
fields = []
with open(filepath, 'r', encoding='cp1252') as f:
for line in f:
line = line.rstrip('\n')
if line.startswith('%T'):
parts = line.split('\t')
current_table = parts[1] if len(parts) > 1 else None
tables[current_table] = []
elif line.startswith('%F'):
fields = line.split('\t')[1:]
elif line.startswith('%R') and current_table:
values = line.split('\t')[1:]
row = dict(zip(fields, values))
tables[current_table].append(row)
return tables
data = parse_xer('project_backup.xer')
# Get all activities
activities = data.get('TASK', [])
print(f"Found {len(activities)} activities")
# Find critical activities (zero or negative float)
critical = [a for a in activities if float(a.get('total_float_hr_cnt', 999)) <= 0]
print(f"Critical activities: {len(critical)}")
# Get all relationships
relationships = data.get('TASKPRED', [])
print(f"Found {len(relationships)} logic links")
cp1252 kodlamasına dikkat. Bu önemli.
Buradan sonrası size kalmış: veriyi pandas’a yükleyebilir, Power BI’a gönderebilir, özel raporlar üretebilir ya da P6’nın yerleşik araçlarının desteklemediği kalite kontrolleri çalıştırabilirsiniz. Ben XER’i parse edip eksik mantığı, aşırı lag kullanımını ve constraint istismarını işaretleyen bir program sağlığı kontrol script’i yazdım. 10.000 aktivitelik bir programda saniyeler içinde çalışıyor.
Pratik Kullanım Alanları
Yedekleme ve arşiv. XER dosyaları, bir programın belirli bir andaki anlık görüntüsünü almanın standart yoludur. Ben her data date’te XER export’u alır, dosyayı tarihle adlandırırım: PRJ001_2026-03-15.xer. Ucuz bir sigorta.
Ortamlar arası taşıma. Bir programı geliştirme ortamındaki P6’dan üretim ortamına taşımak. En temiz yöntem XER export/import.
Adli analiz. Farklı tarihlere ait iki XER dosyasını karşılaştırıp tam olarak neyin değiştiğini görmek. Hangi aktiviteler kaydı? Hangi ilişkiler silindi? Hangi kaynaklar yeniden atandı? İki XER dosyasının TASK tablolarını karşılaştıran bir diff script’i bana onlarca saatlik manuel inceleme kazandırdı.
Veri taşıma. Programları P6 instance’ları ya da sürümleri arasında taşımak. XER dosyaları sürüm bilgisi taşır — ERMHDR satırı, hedef sisteme dosyanın hangi sürümden export edildiğini söyler.
Harici raporlama. P6’nın yerleşik raporları yetmediğinde (ki çoğu zaman yetmez), XER’i parse edip ihtiyacınız olanı kendiniz kurarsınız. Büyük programlarda XER verisiyle beslenen Power BI dashboard’ları oldukça yaygın.
Sık Düşülen Tuzaklar
Kodlama Windows-1252’dir, UTF-8 değil. Gördüğüm en yaygın parse hatası bu. Uluslararası karakterler — aksanlı adlar, Arapça metin, CJK karakterleri — dosyayı UTF-8 olarak okursanız bozulur. Kodlama olarak her zaman cp1252 ya da latin-1 belirtin. Çok dilli veri barındıran bir P6 instance’ıyla çalışıyorsanız, ASCII dışı karakter içeren bir dosyayla test edin.
Alanlar tab ile ayrılır. Alan değerlerinin içindeki boşluklar veridir, ayraç değil. Alanları yalnızca tab karakteri ayırır. Tab yerine boşluğa göre bölerseniz veriniz yanlış çıkar.
Boş alanlar ardışık tab’lardır. Arasında hiçbir şey olmayan iki tab, boş bir değer demektir. Boşlukları kırpar ya da birleştirirseniz o satırdaki sonraki tüm alanlar kayar.
Tarihler YYYY-MM-DD HH:MM biçimindedir. P6 sunucusunun yerel saatiyle tutulurlar; illa UTC değildir. Bu konuda çelişkili dokümantasyon gördüm. Pratikte, önemli olduğu durumlarda P6 arayüzüyle doğrulayın.
Dahili ID’ler Activity ID değildir. task_id alanı P6’nın dahili sayısal tanımlayıcısıdır. Export’lar ve ortamlar arasında değişir. Kullanıcıların gördüğü kalıcı Activity ID ise task_code alanıdır. XER dosyaları arasında veri eşleştirirken task_id değil task_code kullanın.
XER dosyaları sürüme bağlıdır. P6 24.12’den export edilen bir XER, P6 19.12’ye temiz import olmayabilir. Tablo yapıları sürümler arasında evrilir. Yeni alanlar eklenir. ERMHDR’deki sürümü kontrol edin ve uyumluluğu varsaymadan önce import’u test edin.
Formatı anlamak, veriyi sistemler arasında taşımayı da yönetilebilir kılan şeydir — ki bir entegrasyon ve veri taşıma çalışmasının işin büyük kısmı budur.